專案中需要寫乙個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...