專案中oracle儲存過程記錄 常用語法備忘

2021-06-26 07:49:02 字數 2317 閱讀 9188

專案中需要寫乙個oracle儲存過程,需求是收集乙個複雜查詢的內容(涉及到多張表),然後把符合條件的記錄插入到目標表中。其中原表之一的日期欄位是timestamp型別,目標表的字段是varchar2型別;

其中一些內容很常用,所以做下記錄,供查詢。

oracle儲存過程和函式都可以實現,一般沒有返回值,則採用儲存過程,函式比sqlserver的功能強大。oracle變數定義最好加上字首如v_,查詢條件中變數名稱和欄位名稱不能重複。

createor replace procedure proc_name (

v_interval in number default -3 –param_name_list

)as

v_cnt            number(4); -- 定義變數及游標

begin

--業務邏輯語句

endproc_name

cursor  cursor_name is

select * from dual – select 語句;

迴圈游標有多種方式,最簡單的for方式,避免定義一些變數及開啟、關閉游標,可以簡化很多**,但是如果需要訪問游標記錄條數,就需要loop或while迴圈。

forloop 語法:

for currow   in cursor_name  -- currow是游標的行記錄變數

loop

--直接通過currow.游標字段取值(省略了變數的定義)

endloop;

date型別是乙個7位元組的定寬日期/時間資料型別。它總是包含7個屬性,包括:世紀、世紀中哪一年、月份、月中的哪一天、小時、分鐘和秒;timestamp型別與date非常類似,只不過另外還支援小數秒和時區。下面的n值可以為負數。

ø  使用numtodsinterval內建函式來增加小時、分鐘和秒。

比如:date+numtodsinterval(n,'minute')

ø  加乙個簡單的數來增加天。

比如:date+n

ø  使用add_months內建函式來增加月和年。

比如:add_months(date,n)

ø  使用months_between內建函式來計算日期之間的月數。

比如:select months_between(sysdate,to_date('2010-10-10','yyyy-mm-dd')) from dual;

select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff')time1 from dual;

--年月日時分秒及6位毫秒;

select to_char(systimestamp  ,'yyyy-mm-dd hh24:mi:ss.ff1') from dual;

--年月日時分秒及毫秒(位數由ff後面的數字決定,1~9之間,ff3表示保留三位毫秒)

oracel沒有sqlserver的if exist 語法,只能變形實現,建議使用下面的語法:

v_cnt            number(4); -- 宣告變數;

selectcount(*) into v_cnt from dual where exists (select 語句);

示例:declare

v_cnt number;

begin

select count(*)  into v_cnt from dual

where exists (select * from table_namewhere col_name=1);

if v_cnt = 0 then

dbms_output.put_line('無記錄, 在此寫你的業務**');

endif;

end;

如果欄位不允許為空,使用nvl函式;如:nvl(field_name,』 』),需要說明的兩個單引號直接是空格,如果沒有任何字元,oracle也視為null。

sys_guid()生成32為uuid;

substr(字串,擷取開始位置,擷取長度) //返回擷取的字

substr('hello world',0,1) //返回結果為 'h'  *從字串第乙個字元開始擷取長度為1的字串

substr('hello world',1,1) //返回結果為 'h'  *0和1都是表示擷取的開始位置為第乙個字元

substr('hello world',2,4) //返回結果為 'ello'

複雜的業務一般都需要除錯,感覺plsqldeveloper除錯比較方便。右鍵選擇需要除錯的儲存過程,在測試視窗即可單步除錯。

在SSH專案中呼叫儲存過程

一 建表與初始化資料 create database user create table userinfo id int identity 1,1 primary key not null,name varchar 20 not null,age int not null 建表成功後,在該表中任意插...

oracle儲存過程輸出多行記錄

今天oracle上機實驗。作業題目要求 顯示所有學生學號和姓名。type,rowtype都只能讀出一行記錄。但是游標可以讀多行。cursor select into v record from s declare cursor l c is select sno,sname from s begin...

專案中的一些儲存過程

物件名稱 pr user getpersonalcomplete 功能描述 獲取個人使用者資訊完成百分比 引數說明 呼叫示例 execute pr user getpersonalcomplete 1,1 作 者 xu yu 修改人 create procedure pr user getperso...