Oracle学习操作(6)函数与存储过程
生活随笔
收集整理的這篇文章主要介紹了
Oracle学习操作(6)函数与存储过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、oracle自定義函數
?
1.不帶參數的函數:
返回t_book表的總條數:
SQL> create function getBookCount return number as2 begin3 declare book_count number;4 begin5 select count(*) into book_count from t_book;6 return book_count;7 end;8 end getBookCount;9 /函數已創建。//sys dba給當前用戶授權創建函數、創建存儲過程的權限,function 跟 procedure 原來是兩位一體的。 //SQL> grant create any procedure to c##chengyu;調用函數:
SQL> set serveroutput on; SQL> begin2 dbms_output.put_line('表t_book有'||getBookCount()||'條記錄');3 end;4 / 表t_book有3條記錄PL/SQL 過程已成功完成。2.函數,帶參數
例1.查某個表的記錄數:
SQL> create function getTableRecord(table_name varchar2) return number as2 begin3 declare table_count number;4 query_sql varchar2(200);5 begin6 query_sql:='select count(*) from '|| table_name;7 execute immediate query_sql into table_count;8 return table_count;9 end;10 end getTableRecord;11 /函數已創建。//execute immediate 立即執行;調用:
SQL> begin2 dbms_output.put_line('表有'|| getTableRecord('emp') ||'條數據');3 end;4 / 表有14條數據PL/SQL 過程已成功完成。例2:顯示emp表的sal的稅收情況:
SQL> create or replace function sal_tax(v_sal number) return number as2 begin3 if v_sal < 2000 then4 return 0.10;5 else if v_sal < 2750 then6 return 0.15;7 else8 return 0.20;9 end if;10 end if;11 end sal_tax;12 /函數已創建。SQL> select lower(ename), sal_tax(sal) from emp;LOWER(ENAM SAL_TAX(SAL) ---------- ------------ smith .1 allen .1 ward .1 jones .2 martin .1 blake .2 clark .15 scott .2 king .2....已選擇 14 行。?
二、存儲過程
1.不帶參數的存儲過程:
SQL> create or replace procedure p as2 begin3 declare cursor c is select * from emp2 for update;4 begin5 for v_emp in c loop6 if(v_emp.deptno = 10) then7 update emp2 set sal = sal+1 where current of c;8 else if(v_emp.deptno = 20) then9 update emp2 set sal = sal+2 where current of c;10 else11 update emp2 set sal = sal+5 where current of c;12 end if;13 end if;14 end loop;15 commit;16 end;17 end p;18 /過程已創建。執行存儲過程p:
SQL> execute p;PL/SQL 過程已成功完成。SQL> select ename, sal from emp2;ENAME SAL ---------- ---------- SMITH 802 ALLEN 1605 WARD 1255 JONES 2977 MARTIN 1255 BLAKE 2855 CLARK 2451 SCOTT 3002 KING 5001...已選擇 14 行。2.帶參數的存儲過程:
1)需求:添加記錄到t_book,如果bookname存在,則不執行插入操作:
SQL> create procedure addBook(book_name in varchar2, typeId in number) as2 begin3 declare maxId number;4 n number;5 begin6 select count(*) into n from t_book where bookname = book_name;7 if (n>0) then8 return;9 end if;10 select max(id) into maxId from t_book;11 insert into t_book values (maxId+1, book_name, typeId);12 commit;13 end;14 end addBook;15 /過程已創建。執行存儲過程:
SQL> execute addBook('java好東西',1);PL/SQL 過程已成功完成。SQL> select * from t_book;ID BOOKNAME TYPEID ---------- ---------- ----------1 java編程思 12 一頭扎進ja 13 生物起源 24 java好東西 1SQL> execute addBook('java好東西',1);PL/SQL 過程已成功完成。SQL> select * from t_book;ID BOOKNAME TYPEID ---------- ---------- ----------1 java編程思 12 一頭扎進ja 13 生物起源 24 java好東西 1 View Code2)out:只出不進:相當于一個返回值;
需求:對t_book執行插入操作,將操作前表的記錄數、操作后表的記錄數返回:
n1:操作前表的記錄數; n2:操作后表的記錄數; execute是執行單句存儲過程的; SQL> create or replace procedure addBook2(book_name in varchar2, typeId in numbe r, n1 out number, n2 out number) as2 begin3 declare maxId number;4 n number;5 begin6 select count(*) into n1 from t_book;7 select count(*) into n from t_book where bookname = book_name;8 if (n>0) then9 return;10 end if;11 select max(id) into maxId from t_book;12 insert into t_book values (maxId+1, book_name, typeId);13 select count(*) into n2 from t_book;14 commit;15 end;16 end addBook2;17 /過程已創建。執行:
SQL> declare n1 number;2 n2 number;3 begin4 addBook2('jaas阿斯達',2,n1,n2);5 dbms_output.put_line('n1='||n1);6 dbms_output.put_line('n2='||n2);7 end;8 / n1=4 n2=5PL/SQL 過程已成功完成。?
out的另外例子:
SQL> create or replace procedure p_inout(a in number, b number, ret out number, temp in out number) as2 begin3 if(a > b) then4 ret := a;5 else6 ret := b;7 end if;8 temp := temp + 1;9 end p_inout;10 /過程已創建。執行p_inout:
SQL> declare a number:=3;2 b number:=4;3 ret number;4 temp number:=5;5 begin6 p_inout(a, b, ret, temp);7 dbms_output.put_line(ret);8 dbms_output.put_line(temp);9 end;10 / 4 6PL/SQL 過程已成功完成。//存儲過程中參數分為不同的類型: // in傳入參數,誰調用這個存儲過程,誰負責給a賦值; //out傳出參數, 將ret傳出到調用環境中去; //什么都沒寫,b默認是傳入參數; //in out temp既可以接收,又可以傳出?
三、程序包
當項目中模塊很多的時候,用程序包管理下面的函數和存儲過程,這樣就能包.函數 或者 包.存儲過程,方便管理了; 變量在包下面的 函數和存儲過程 是共享的變量; 創建程序包: SQL> create or replace package pkg_book as2 function getBookCount return number;3 function getTableRecord(table_name varchar2) return number;4 procedure addBook(book_name in varchar2, typeId in number);5 end pkg_book;6 /程序包已創建。創建包體:
SQL> create package body pkg_book as23 function getBookCount return number as4 begin5 declare book_count number;6 begin7 select count(*) into book_count from t_book;8 return book_count;9 end;10 end getBookCount;1112 function getTableRecord(table_name varchar2) return number as13 begin14 declare table_count number;15 query_sql varchar2(200);16 begin17 query_sql:='select count(*) from '|| table_name;18 execute immediate query_sql into table_count;19 return table_count;20 end;21 end getTableRecord;2223 procedure addBook(book_name in varchar2, typeId in number) as24 begin25 declare maxId number;26 n number;27 begin28 select count(*) into n from t_book where bookname = book_name;29 if (n>0) then30 return;31 end if;32 select max(id) into maxId from t_book;33 insert into t_book values (maxId+1, book_name, typeId);34 commit;35 end;36 end addBook;3738 end pkg_book;39 /程序包體已創建。調用:使用程序包.函數名來調用;
SQL> set serveroutput on; SQL> begin2 dbms_output.put_line('表t_book有'||pkg_book.getBookCount()||'條記錄');3 end;4 / 表t_book有5條記錄PL/SQL 過程已成功完成。?
轉載于:https://www.cnblogs.com/tenWood/p/6637822.html
總結
以上是生活随笔為你收集整理的Oracle学习操作(6)函数与存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】JMeter学习(六)集合点
- 下一篇: C与c++中-什么时候用,头文件中与“”