存儲過程
創建過程范例
create or replace procedure pro_kingsql_p1(
p_one in varchar2,--可以傳入參數
p_two out varchar2,--可以返回值
p_three in out varchar2)--既可以傳入參數,又可以返回值
is
begin
dbms_output.put_line('parameter: '||'p_one: '||p_one ||'p_two: '||p_two ||',p_three:'||p_three);
end;
/
set serveroutput on
declare
two varchar2(20):='zhuohui';
three varchar2(20):='hong';
begin
pro_kingsql_p1('kingsql',two,three);
end;
/
parameter: p_one: kingsql p_two: ,p_three:hong
PL/SQL procedure successfully completed.
declare
begin
pro_kingsql_p1('kingsql','KINGSQL2','KINGSQL3');
end;
/
pro_kingsql_p1('kingsql','KINGSQL2','KINGSQL3');
*
ERROR at line 3:
ORA-06550: line 3, column 26:
PLS-00363: expression 'KINGSQL2' cannot be used as an assignment target
ORA-06550: line 3, column 37:
PLS-00363: expression 'KINGSQL3' cannot be used as an assignment target
ORA-06550: line 3, column 1:
PL/SQL: Statement ignored
create or replace procedure pro_kingsql_p1(
p_one in varchar2,--可以傳入參數
p_two out varchar2,--可以返回值
p_three in out varchar2--既可以傳入參數,也可以返回值
)is
two_a varchar2(20):='haha';
begin
p_two:=two_a;--twoa變量賦給p_two參數.
dbms_output.put_line('parameter: '||p_one ||',p_two: '||p_two ||',p_three: '||p_three);
end;
/
~
SQL> set serveroutput on
SQL> declare
2 two varchar2(20):='zhuohui';
3 three varchar2(20):='hong';
4 begin
5 pro_kingsql_p1('kingsql',two,three);
6 end;
7 /
parameter: kingsql,p_two: haha,p_three: hong
PL/SQL procedure successfully completed.
OUT、IN OUT不能設置默認值
create or replace procedure pro_kingsql_p1(
p_one in varchar2,
p_two out varchar2,
p_three in out varchar2 default ‘kingsql3’)
is
begin
dbms_output.put_line('parameter: '||'p_one: '||p_one ||'p_two: '||p_two ||',p_three:'||p_three);
end;
/
會報錯
過程調用
create or replace procedure pro_kingsql_p2(
v_001 in varchar2,
v_002 out varchar2,
v_003 out varchar2)
is
zhuohui varchar2(100):='zhuohui';
hong varchar2(100):='hong';
begin
v_002:=zhuohui;
v_003:=hong;
dbms_output.put_line(v_001||'tel:13820305037');
pro_kingsql_p1(v_001,v_002,v_003);
end;
/
declare
two varchar2(20):='hehe';
three varchar2(20):='gaga';
begin
pro_kingsql_p2('kingsql',two,three);
end;
/
刪除過程
DROP PROCEDURE 過程名
比較存儲過程和函數
過程:執行一個PL/SQL語句,在頭部不包含RETURN語句,可以返回多個值,不包含RETURN語句
函數:作為表達式的一部分調用,在頭部必須包含一個RETURN字句,必須返回一個單個的值,必須包含至少一個RETURN語句
寫一個輸出工資等級的過程
create or replace procedure pro_emp_02(
v_eno emp.empno%type)
is
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno=v_eno;
case
when v_sal between 0 and 2000 then
dbms_output.put_line(v_ename||'每個月賺'||v_sal||'小意思');
when v_sal between 2001 and 5000 then
dbms_output.put_line(v_ename||'每個月賺'||v_sal||'中等意思');
when v_sal>5000 then
dbms_output.put_line(v_ename||'每個月賺'||v_sal||'開始有意思');
else
dbms_output.put_line(v_ename||'每個月賺'||v_sal||'小意思');
end case;
end pro_emp_02;
/
execute pro_emp_02(7788);
SCOTT每個月賺3000中等意思
寫一個顯示年薪的過程
create or replace procedure pro_emp_01(
v_eno in emp.empno%TYPE)
is
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
select ename,sal into v_ename,v_sal from emp where empno=v_eno;
dbms_output.put_line(v_ename||'''s annual salary is'||v_sal*12);
end pro_emp_01;
/
Execute pro_emp_01(7566);
JONES's annual salary is35700