1. 程式人生 > >[oracle]pl/sql in/out變數的使用和過程中過程的呼叫

[oracle]pl/sql in/out變數的使用和過程中過程的呼叫

--in/out 型別變數的使用 以及過程中呼叫過程,獲取out型別的返回值

--建一張表books --簡單過程一 插入一條記錄
  1. createtable books(bookid number,bookname varchar(50),pubhouse varchar(50));   
  2. --簡單過程一 插入一條記錄 
  3. createorreplaceprocedure sub_pro1   
  4. (bookid in number,bookname in varchar2,pubhouse in varchar2) is
  5. begin
  6.   insertinto books values(bookid,bookname,pubhouse);   
  7. end

測試:
  1. SQL> exec sub_pro1(1,'wudi','安徽文藝出版社');   
  2. PL/SQL procedure successfully completed   

--簡單過程二 由id獲取一條記錄的的name
  1. createorreplaceprocedure sub_pro2   
  2. (bookid in number,bookname out varchar2) is
  3. begin
  4.    select bookname into bookname from books where bookid=bookid;   
  5. end;   
  6. --呼叫過程,並打印出結果 
  7. createorreplaceprocedure sub_pro22   
  8. (bookno in number) is
  9. --接受out變數的內容 
  10. v_bookname varchar(50);   
  11. begin
  12.   --直接呼叫過程 
  13.   sub_pro2(bookno,v_bookname);   
  14.   --如果成功呼叫,那麼變數應該是有值的 
  15.   dbms_output.put_line(bookno||' 的圖書為'||v_bookname);   
  16. end;   

測試:
  1. SQL> exec sub_pro22(1);   
  2. 1 的圖書為wudi   
  --簡單過程三 得到一個使用者集合的結果集,取出同一個出版社的書的id和name
 
  1. books表中插入這麼幾條資料   
  2.     BOOKID BOOKNAME                                           PUBHOUSE   
  3. ---------- -------------------------------------------------- -------------------------------------------------- 
  4.          1 wudi                                               安徽文藝出版社   
  5.          2 haorn                                              10   
  6.          3 angle                                              20   
  7.          4 anglele                                            10   
  1. --1 建立一個包,定義一個cursor為test_cursor 
  2. createorreplace package testpackage as
  3. type test_cursor is ref cursor;   
  4. end testpackage;   
  5. --2 建立過程 
  6. createorreplaceprocedure sub_pro3   
  7. (l_pubhouse in varchar2,l_cursor out testpackage.test_cursor) is
  8. begin
  9.   open l_cursor forselect bookid,bookname from books where pubhouse=l_pubhouse;   
  10. end;   
  11. --3 呼叫過程 列印與遊標 
  12. createorreplaceprocedure sub_pro33(l_pubhouse in varchar2) is
  13. books_cursor testpackage.test_cursor;   
  14. v_bookid books.bookid%type;   
  15. v_bookname books.bookname%type;   
  16. begin
  17.   sub_pro3(l_pubhouse,books_cursor);   
  18.   loop    
  19.     fetch books_cursor into v_bookid,v_bookname;   
  20.     --not found要連在一起寫 
  21.     exit when books_cursor%notfound;   
  22.     dbms_output.put_line('圖書ID是:'||v_bookid||'  名稱是:'||v_bookname);   
  23.   end loop;   
  24. end;   

看起來還能用:
  1. SQL> exec sub_pro33('10');   
  2. 圖書ID是:2  名稱是:haorn   
  3. 圖書ID是:4  名稱是:anglele   
  4. PL/SQL procedure successfully completed   


注意!1 過程中的呼叫只要直接寫過程名就好了,不要什麼呼叫關鍵字。

2 對於out型別的值直接宣告一個相同型別的變數來接收就好了。

3 為了好測試才用另一個過程來顯示結果的,以後會通過jdbc來呼叫過程,獲取函式。