Oracle存儲過程詳解


創建存儲過程

CREATE OR REPLACE PROCEDURE TEST_COUNT AS 
v_total number(10);
BEGIN
select count(*) into v_total from testtable;
dbms_output.put_line('總人數:'||v_total);
END TEST_COUNT;

CREATE OR REPLACE 的意思就是如果這個存儲過程沒有就創建(CREATE ),如果這個存儲過程存在,那么就替換(REPLACE)。
v_total number(10)的意思就是聲明一個變量v_total,它的類型是number(10).
BEGIN關鍵字,表示開始跟 END 存儲過程的過程名字是固定的格式。
select count(*) into v_total from testtable;的意思是從testtable行數綜合和賦值給v_total。
可以換成 select student_name into s_name from testtable,換句話說查詢的結果是可以賦值給上面聲明的變量,可以查詢賦值一個,也可以查詢多個賦值給多個變量,當然一般不這么做,因為還可以使用游標。


使用游標的存儲過程

CREATE OR REPLACE PROCEDURE TEST_COUNT AS
CURSOR test_cursor is select t.id1,t.name from testtable t;
BEGIN
for test_record in test_cursor 
loop
dbms_output.put_line(test_record.id1||test_record.name);//打印test_record和test_record.name
end loop;
END TEST_COUNT;

CURSOR test_cursor is select t.id1,t.name from testtable t;
聲明一個游標 test_cursor (格式 Cursor XX is),游標的意思就類似我們編程語言中的集合,在這里他的結果就是把查詢testtable中的t.id1和t.name賦值給游標test_cursor,接下來利用 loop循環(類似for函數)依次遍歷出來。


帶參數的存儲過程

CREATE OR REPLACE PROCEDURE TEST_COUNT(p_id1 in varchar2 default'0') AS
v_name varchar2(20);
BEGIN
select t.name into v_name from testtable t where t.id1=p_id1;
dbms_output.put_line('姓名:'||v_name);
END TEST_COUNT;

要給存儲過程帶參數只需要在過程名后面加括號帶參數,類似Java(function(param param1))這樣子就可以了,當然參數要聲明類型,帶進來的參數在后面的存儲過程中均可以直接使用。


拼接SQL還有使用動態游標
接下來進階了,拼接SQL還有使用動態游標,因為之前的游標都是直接賦值的,不像其他一樣先聲明,后賦值,所以使用動態游標可以解決這個問題。
還是剛剛的帶參數的存儲過程,如果ID是空的,那我們不是查不到數據,所以我們可以實現先判斷id是不是空,如果是空,那么不傳參,如果有才傳參。

CREATE OR REPLACE PROCEDURE TEST_COUNT(p_id1 in varchar2 default'0') AS
type ref_cursor is ref cursor; //類似C語言里面的typedef(個人見解)
t_result ref_cursor;//所以現在t_result就是一個 動態游標(其實還是游標)
t_sql varchar(100);//聲明t_sql來拼接sql,切記sql在oracle是關鍵字
v_name varchar(50);
BEGIN
t_sql:='select t.name into v_name from testtable t where 1=1';//1-1是為了把where關鍵字代入。
if p_id1 is not null 
t_sql:=t_sql||'where t_id1='||p_id1;
end if //if .... end if 固定格式
open t_result for t_sql //打開動態游標,其實就是把結果集賦值給t_result.
loop
fetch t_result into v_name;
exit when t_result%notfound;//當結果集沒有什么影響就跳出循環
dbms_output.put_line(v_name);
end loop;
END TEST_COUNT;

返回結果集是游標

create or replace
package test_package  
as  
type cursorRef is ref cursor; --定義游標引用類型  
procedure test_procedure(p_id number,cursor_ref out cursorRef);  
end test_package;

第一步創建程序包,其實一般的存儲過程都是先創建程序包的。
然后再來創建存儲過程。

create or replace
PACKAGE BODY  test_package IS
procedure test_procedure(p_id number,cursor_ref out cursorRef)// 因為是out的,所以這個cursor_ref是輸出的也就是返回的游標,out關鍵字
BEGIN
open cursor_ref for select * from testtable t where t.id1=p_id;
end test_procedure;
end test_package;
select * from testtable t where t.id1 =1;

這樣子調用就可以返回游標型的結果集。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • oracle存儲過程常用技巧 我們在進行pl/sql編程時打交道最多的就是存儲過程了。存儲過程的結構是非常的簡單的...
    dertch閱讀 3,509評論 1 12
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 我們在進行pl/sql編程時打交道最多的就是存儲過程了。存儲過程的結構是非常的簡單的,我們在這里除了學習存儲過程的...
    AlbenXie閱讀 2,983評論 1 3
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 開經偈:無量甚深微妙法,百千萬劫難遭遇我今見聞得受持,愿解如來真實義; 溫馨提示:此筆記是個人聽課記錄,如有斷句,...
    善緣的愛閱讀 2,157評論 0 6