1、存儲過程【procedure】
公司主營業(yè)務:成都網(wǎng)站設計、成都網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出鲅魚圈免費做網(wǎng)站回饋大家。
什么是存儲過程?
事先運用oracle語法寫好的一段具有業(yè)務功能的程序片段,長期保存在oracle服務器中,供oracle客戶端(例如,sqlplus)和程序語言遠程訪問,類似于Java中的函數(shù)。
為什么要用存儲過程?
(1)PLSQL每次執(zhí)行都要整體運行一遍,才有結果
(2)PLSQL不能將其封裝起來,長期保存在oracle服務器中
(3)PLSQL不能被其它應用程序調用,例如:Java
存儲過程與PLSQL是什么關系?
存儲過程是PLSQL的一個方面的應用,而PLSQL是存儲過程的基礎。
即存儲過程需要用到PLSQL。
--------------------------------------------------------存儲過程
語法:
create [or replace] procedure 過程名[(參數(shù)列表)] as PLSQL程序體;
注意:存儲過程中有【begin…end;/】,無declare
創(chuàng)建無參存儲過程hello,無返回值,語法:create or replace procedure 過程名 as PLSQL程序
create or replace procedure hello as begin dbms_output.put_line('這是我的第一個存儲過程'); end; /
刪除存儲過程hello,語法:drop procedure 過程名
drop procedure hello;
調用存儲過程方式一,exec 存儲過程名
exec hello;
調用存儲過程方式二,PLSQL程序
begin hello; end; /
調用存儲過程方式三,Java程序
JDBC中講過一個對象:CallableStatement
創(chuàng)建有參存儲過程raiseSalary(編號),為7369號員工漲10%的工資,演示in的用法,默認in,大小寫不敏感
-- 定義過程 create or replace procedure raiseSalary(pempno number) as begin update emp set sal=sal*1.2 where empno=pempno; end; / -- 調用過程 exec raiseSalary(7369);
創(chuàng)建有參存儲過程findEmpNameAndSalAndJob(編號),查詢7788號員工的的姓名,職位,月薪,返回多個值,演示out的用法
-- 定義過程 create or replace procedure findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number) as begin select ename,job,sal into pename,pjob,psal from emp where empno=pempno; end; / -- 調用過程 declare pename emp.ename%type; pjob emp.job%type; psal emp.sal%type; begin findEmpNameAndSalAndJob(7369,pename,pjob,psal); dbms_output.put_line('7369號員工的姓名是' || pename ||',職位是' || pjob || ',月薪是' || psal); end; /
什么情況下用exec調用,什么情況下用PLSQL調用存儲過程?
exec適合于調用存儲過程無返回值
plsql適合于調用存儲過程有返回值,不管多少個
用存儲過程,寫一個計算個人所得稅的功能
-- 定義存儲過程 create or replace procedure get_rax(sal in number,rax out number) as -- sal表示收入 -- bal 表示需要交稅的收收入 bal number; begin bal := sal - 3500; if bal <= 1500 then rax := bal * 0.03 - 0; elsif bal <= 4500 then rax := bal * 0.1 - 105; elsif bal <=9000 then rax := bal * 0.2 - 555; elsif bal <=35000 then rax := bal * 0.25 - 1005; elsif bal <= 55000 then rax := bal * 0.3 - 2755; elsif bal <=80000 then rax := bal * 0.35 - 5505; else rax := bal * 0.45 - 13505; end if; end; / -- 調用存儲過程 declare -- 需要交的稅 rax number; begin get_rax(&sal,rax); dbms_output.put_line('你需要交稅' || rax); end; /
2、存儲函數(shù)
創(chuàng)建無參存儲函數(shù)getName,有返回值,語法:create or replace function 函數(shù)名 return 返回類型 as PLSQL程序段
create or replace function get_name return varchar2 as begin return 'hello 你好'; end; /
刪除存儲函數(shù)getName,語法:drop function 函數(shù)名
drop function get_name;
調用存儲函數(shù)方式一,PLSQL程序
declare name varchar2(20); begin name := get_name(); dbms_output.put_line(name); end; /
調用存儲函數(shù)方式二,Java程序
創(chuàng)建有參存儲函數(shù)findEmpIncome(編號),查詢7369號員工的年收入,演示in的用法,默認in
-- 定義存儲函數(shù) create or replace function findEmpIncome(pempno in number) return number as income number; begin select sal*12+NVL(comm,0) into income from emp where empno=pempno; return income; end; / -- 調用存儲函數(shù) declare income number; begin income := findEmpIncome(&income); dbms_output.put_line('該員工的年收入為' || income); end; /
創(chuàng)建有參存儲函數(shù)findEmpNameAndJobAndSal(編號),查詢7788號員工的的姓名(return),職位(out),月薪(out),返回多個值
-- 定義存儲函數(shù) create or replace function findEmpNameAndJobAndSal(pempno in number,pjob out varchar2, psal out number) return varchar2 as pename emp.ename%type; begin select ename,job,sal into pename,pjob,psal from emp where empno=pempno; return pename; end; / -- 調用存儲函數(shù) declare pename emp.ename%type; pjob emp.job%type; psal emp.sal%type; begin pename := findEmpNameAndJobAndSal(&empno,pjob,psal); dbms_output.put_line('7369號員工的姓名是'|| pename ||',職位是'|| pjob || ',月薪是' || psal); end; /
3、存儲過程和存儲函數(shù)的適合場景
注意:適合不是強行要使用,只是優(yōu)先考慮
什么情況下【適合使用】存儲過程?什么情況下【適合使用】存儲函數(shù)?
【適合使用】存儲過程:無返回值 或 有多個返回值時,適合用過程
【適合使用】存儲函數(shù):有且只有一個返回值時,適合用函數(shù)
什么情況【適合使用】過程函數(shù),什么情況【適合使用】SQL?
【適合使用】過程函數(shù):
》需要長期保存在數(shù)據(jù)庫中
》需要被多個用戶重復調用
》業(yè)務邏輯相同,只是參數(shù)不一樣
》批操作大量數(shù)據(jù),例如:批量插入很多數(shù)據(jù)
【適合使用】SQL:
》凡是上述反面,都可使用SQL
》對表,視圖,序列,索引,等這些還是要用SQL
批量添加操作示例:
-- 定義過程 create or replace procedure batchInsert as i number(4) := 1; begin for i in 1..999 loop insert into emp(empno,ename) values(i,'員工'||i); end loop; end; / -- 調用過程 exec batchInsert;