create or replace procedure pro_test
is
begin
select * from t_test;
end pro_test;
這個預存程序正確嗎?
昨天因為這個,耽誤了好久(在一個預存程序中用了select語句,但既沒有用遊標也沒有用into).
在預存程序(oracle資料庫教程)中如果用了select語句,要麼使用"select into 變數"語句要麼使用遊標,oracle不支援單獨的select語句(如表述有誤請指出).
select into 比較簡單,但是如果返回的是一個結果集就無法滿足要求了.
遊標分cursor型遊標和sys_refcursor型遊標兩種
cursor型遊標--不能用於參數傳遞
create or replace procedure pro_test() is
cusor_1 cursor is select 欄位名 from 表名 where 條件;
(或者
select class_name into cursor_2 from class where ...;
cursor的另一種用法,需要寫在begin和end之間)
begin
select class_name into cursor_2 from class where ...;
可以使用
for xxx in cursor
loop
....
end loop; --對cursor進行遍曆
end pro_test;
sys_refcursor型遊標
create or replace procedure pro_test(rscursor out sys_refcursor) is
cursor sys_refcursor;
name varhcar(20);
begin
open cursor for
select name from student where ...; --使用open來開啟進行賦值
--遍曆
loop
fetch cursor into name --fetch into來開啟遍曆的每條資料
exit when cursor%notfound; --未找到記錄資訊
dbms_output.putline(xxxx);
end loop;
rscursor := cursor;
end pro_test;
如何在預存程序中調用其他的預存程序(這些都是帶參數的)
一個帶參數的預存程序。
sql> create or replace procedure helloworld1 (
2 p_user_name varchar2
3 ) as
4 begin
5 dbms_output.put_line('hello ' || p_user_name || '!');
6 end helloworld1;
7 /
procedure created.
sql> create or replace procedure callhelloworld1 (
2 p_user varchar2
3 ) as
4 begin
5 -- 調用預存程序的 預存程序
6 helloworld1(p_user);
7 end callhelloworld1;
8 /
procedure created.
執行
sql> set serveroutput on
sql> exec callhelloworld1( 'tom' );
hello tom!
pl/sql procedure successfully completed.