創建存儲過程
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;
這樣子調用就可以返回游標型的結果集。