plsql子程序参数传递

本文深入讲解PL/SQL中参数的传递方式,包括位置传递、名字传递及混合传递,并探讨in、out、inout三种参数模式的特点。此外,还介绍了子程序中默认值的应用,以及通过重载、继承和多态实现的复杂程序设计。

1、位置的,名字的,混合的参数传递:

DECLARE
emp_num NUMBER(6) := 120;
bonus NUMBER(6) := 50;
PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS
BEGIN
UPDATE employees SET salary = salary + amount WHERE employee_id = emp_id;
END raise_salary;
BEGIN
raise_salary(emp_num, bonus);     -- positional procedure call for actual parameters --位置传递
raise_salary(amount => bonus, emp_id => emp_num);      -- named parameters--名字传递用双箭头
raise_salary(emp_num, amount => bonus);        -- mixed parameters --混合传递

END;

2、in,out,in out 三个参数模式:


再看看下面的例子:可以这样理解:in类型的在子程序块中相当于是一个常量,直接拿过来用,不能被赋值;out类型的相当于是一个变量可以在子程序块中被赋值。





DECLARE

emp_num NUMBER(6) := 120;

bonus NUMBER(6) := 50;

emp_last_name VARCHAR2(25);

PROCEDURE raise_salary (emp_id IN NUMBER, amount IN NUMBER,

emp_name OUT VARCHAR2) IS

BEGIN

UPDATE employees SET salary = salary + amount WHERE employee_id = emp_id;

SELECT last_name INTO emp_name FROM employees WHERE employee_id = emp_id;--emp_naem是out类型的,相当于变量来使。

END raise_salary;

BEGIN

raise_salary(emp_num, bonus, emp_last_name);

DBMS_OUTPUT.PUT_LINE('Salary has been updated for: ' || emp_last_name);

END;



3、子程序中默认值的使用:

DECLARE

emp_num NUMBER(6) := 120;

bonus NUMBER(6);

merit NUMBER(4);

PROCEDURE raise_salary (emp_id IN NUMBER, amount IN NUMBER DEFAULT 100,   --这里有默认值。如果后面不给赋值,就用默认的咯。

extra IN NUMBER DEFAULT 50) IS

BEGIN

UPDATE employees SET salary = salary + amount + extra

WHERE employee_id = emp_id;

END raise_salary;

BEGIN

raise_salary(120); -- same as raise_salary(120, 100, 50)

raise_salary(emp_num, extra => 25);-- same as raise_salary(120, 100, 25)

END;

4、重载,继承,多态。。

Example 8–11 Resolving PL/SQL Functions With Inheritance
CREATE OR REPLACE TYPE super_t AS OBJECT   --定义一个最高级对象,声明不是final的。
(n NUMBER) NOT final;
/
CREATE OR REPLACE TYPE sub_t UNDER super_t  --定义低一层的对象,也不是final。
(n2 NUMBER) NOT final;
/
CREATE OR REPLACE TYPE final_t UNDER sub_t --定义最顶层的对象
(n3 NUMBER);
/
CREATE OR REPLACE PACKAGE p IS
FUNCTION func (arg super_t) RETURN NUMBER;
FUNCTION func (arg sub_t) RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY p IS
FUNCTION func (arg super_t) RETURN NUMBER IS BEGIN RETURN 1; END;
FUNCTION func (arg sub_t) RETURN NUMBER IS BEGIN RETURN 2; END;
END;
/
DECLARE
v final_t := final_t(1,2,3);         --这是干啥的?
BEGIN
DBMS_OUTPUT.PUT_LINE(p.func(v)); -- prints 2     --最后输出是2,即调用了第二个函数,因为final_t距离上层近的是sut_t,而不是super_t。
END;



CREATE TYPE super_t AS OBJECT
(n NUMBER, MEMBER FUNCTION func RETURN NUMBER) NOT final;
/
CREATE TYPE BODY super_t AS
MEMBER FUNCTION func RETURN NUMBER IS BEGIN RETURN 1; END; END;
/
CREATE OR REPLACE TYPE sub_t UNDER super_t
(n2 NUMBER,
OVERRIDING MEMBER FUNCTION func RETURN NUMBER) NOT final;
/
CREATE TYPE BODY sub_t AS
OVERRIDING MEMBER FUNCTION func RETURN NUMBER IS BEGIN RETURN 2; END; END;
/
CREATE OR REPLACE TYPE final_t UNDER sub_t
(n3 NUMBER);
/
DECLARE
v super_t := final_t(1,2,3);   --我觉得类似java中的多态呢。。。???
BEGIN
DBMS_OUTPUT.PUT_LINE(v.func); -- prints 2  --调用的是sub_t 。。他离final近。。
END;






1、先对in , out ,in out(有个NOCOPY可以加速out 和in out 类型的模式的处理速度) 类型的参数有一个理解:

declare 

 in_string  varchar2(100) :='this is my test string';

 out_string varchar2(200);

 procedure double(original in varchar2, new_string out varchar2) as

   begin

     new_string:=original|| '+'||'original444'; --out 类型的变量可以在函数体内被赋值,但是in类型的就不行了。

     exception

     when value_error then

       dbms_output.put_line('output buffer not long enough.');

    end;

 begin

   double(in_string ,out_string); --传入两个参数,一个是in_string,另一个是要用来被赋值的。具体的操作在函数体内。

   dbms_output.put_line(in_string ||' - ' ||out_string); --先输出一个‘this is my test string’再输出减号 “ - ” 再输出 out_string,此处即为new_string.

 end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值