【PLSQL】過程procedure的形參和實參,plsqlprocedure
************************************************************************ ****原文:blog.csdn.net/clark_xu 徐長亮的專欄************************************************************************1.1 過程procedure
文法:
create or replace procedure proc_name
[(arg_name{in | out | in out} type, …)
]
{is | as }
<local variable declareation>
begin
<executable statements>
exception
<exception handlers>
end;
建立預存程序例子:
create or replace procedure account_number
ls
v_cnt binary_interger;
begin
select count(id) into v_cnt from account;
dbms_output.put_line(‘account number is’ || v_cnt);
end;
1.1.1 調用預存程序
在sql工作表中直接調用:
exec account_number;
1.1.2 預存程序的參數
例如:
create or replace procedure proc1
(p_c1 varchar2,p_c2 out varchar2,p_c3 in out varchar2)
ls
v_c1 varchar(10);
begin
--p_c1 :=p_c1 || ‘d’; --不能做複製的目標
v_c1:=P_c1;
p_c2 :=p_c1 || ‘d’;
p_c3”=p_c3||’d’;
end;
調用為:
exec proc1 (‘abc’,’abc’,’abc’);儲存
調用:
declare
v_c2 varchar2(10) :=’abc’
v_c33 varchar2(20) :=’abc’;
begin
proc1(‘abc’,v_c2,v_c3);
dbms_output.put_line(v_c2);
dbms_outpurt.put_line(v_c3);
end;
1.1.3 形參和實參
建立預存程序中的參數為形參:
create or replace procedure proc1
(p_c1 varchar2,p_c2 out varchar2,p_c3 in out varchar2)
ls
v_c1 varchar(10);
v_c1為過程中的局部變數
調用時候括弧內的參數為實參
proc1(‘abc’,v_c2,v_c3);
形參的種類:
in: 預設模式,在過程的內部形參是唯讀;
out;過程內部,形參可以讀可以寫入;調用過程中,任何的實參將被忽略,即值不會賦給形參;過程執行完成後,當前值賦給對應的實參;
in out:調用過程中,實參的值賦給對應的形參,過程內部,可以讀,可以寫;過程執行結束後,控制返回給控制環境,形參記憶體賦給調用時候的實參;
對實參的要求:
模式為In的形參對應的實參,可以是常量和變數
某省為IN out或OUT的形參對應的實際參數必須是變數;用於儲存返回的值;
形參的限制:
形參不能聲明長度,但是可以使用%TYPE來進行限制
3.1.4 帶參數的程序呼叫
位置標記法:
--調用的添加所有參數,實參和形參按照順序一一對應
名字標記法:
--調用時給出形參名字,並給出實參,例如
procname(12,p_outparm +> v_var1,p_inout =) 10);
兩種方法可以混合用:
混用的時候,第一個參數必須按照位置類指定;
當參數很多的時候,提供者可讀性,用名字標記法;
3.1.5使用預設參數
形參可以指明預設值
parm_name [mode] type {:=|default} int_value;
位置指示法是,所有預設的值都放在最後面;
聲明時,如果有預設值,盡量將預設值放在參數表的末尾;
3.1.6 預存程序的DDL語句
在過程中執行DDL操作,所需的許可權必須通過直接授予的方式,不能通過角色授予;
調用過程時候,所有角色都是disable的,即角色所包含的所有許可權都不能生效;
調用其他使用者的過程,必須有過程的屬主賦予執行許可權
grant execut on procname to userame;
create procedure proc1
ls
begin
execute immediate ‘create table test100(c1 number)’;
end;
************************************************************************ ****原文:blog.csdn.net/clark_xu 徐長亮的專欄************************************************************************