Oracle12C--参数模式(四十一)

  • 3类形式参数:
    • 在定义子程序时,需要接收传递的参数,这种形式参数分为了3类:
      • IN(默认,数值传递):将值传递到子程序中,在子程序所在的修改不会影响原始参数内容;
      • OUT(空进带值出):不带任何数值到子程序中,子程序可以通过此变量将数值返回给调用处;
      • IN OUT(地址传递):可以将值传递到子程序中,同时也会将子程序中对变量的修改返回到调用处;
  • IN模式
    • 此模式为默认的参数传递模式。IN模式类似与常量
    • 示例1:定义过程,使用IN参数模式

CREATE OR REPLACE PROCEDURE in_proc(

p_paramA IN VARCHAR2, -- 明确定义IN参数模式

p_paramB VARCHAR2) -- 默认的参数模式为IN

AS

BEGIN

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramB = ' || p_paramB) ;

END ;

/

分析:
此过程,分别定义了两个参数,第一个参数明确使用了
IN模式,第二个参数没有使用IN模式
但默认为
IN模式

  • 接上例:定义一个PL/SQL块,调用过程

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

v_titleB VARCHAR2(50) := 'Android开发实战经典' ;

BEGIN

in_proc(v_titleA , v_titleB) ;

END ;

/

运行结果:

执行in_proc()过程:p_paramA = Java开发实战经典

执行in_proc()过程:p_paramB = Android开发实战经典
分析:
定义了两个变量,将这两个变量传递到示例
1中;

  • 示例2:定义过程,使用DEFAULT定义参数默认值。这样在使用过程时,可以选择不传递此参数;

CREATE OR REPLACE PROCEDURE in_proc(

p_paramA IN VARCHAR2 ,

p_paramB VARCHAR2 DEFAULT 'Oracle开发实战经典') -- 设置默认值,此参数可以不用传递

AS

BEGIN

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramB = ' || p_paramB) ;

END ;

/

  • 接上例:调用过程,少传一个参数

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

BEGIN

in_proc(v_titleA ) ;

END ;

/

运行结果:

执行in_proc()过程:p_paramA = Java开发实战经典

执行in_proc()过程:p_paramB = Oracle开发实战经典
分析:
只传递了一个参数,未传递参数的值,会采用默认值

  • 示例3:在函数之中使用IN参数模式

CREATE OR REPLACE FUNCTION in_fun(

p_paramA IN VARCHAR2 ,

p_paramB VARCHAR2 DEFAULT 'Oracle开发实战经典')

RETURN VARCHAR2

AS

BEGIN

RETURN 'Android开发实战经典' ;

END;

/

分析:
此定义的函数,定义了两个
IN参数模式的变量,

然后在函数中将返回一个字符串给函数调用处

  • 接上例:编写PL/SQL块调用函数

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

v_return VARCHAR2(50) ;

BEGIN

v_return := in_fun(v_titleA) ;

DBMS_OUTPUT.put_line('in_fun()函数返回值:v_return = ' || v_return) ;

END ;

/

运行结果:
in_fun()函数返回值:v_return = Android开发实战经典

  • OUT模式
    • OUT模式可以将一个变量带到子程序中,但该变量保存的内容不会被传递到子程序,相当于一个空变量;
    • 示例1:定义过程,使用OUT参数模式

CREATE OR REPLACE PROCEDURE out_proc(

p_paramA OUT VARCHAR2, -- OUT参数模式

p_paramB OUT VARCHAR2) -- OUT参数模式

AS

BEGIN

DBMS_OUTPUT.put_line('执行out_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行out_proc()过程:p_paramB = ' || p_paramB) ;

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

END ;

/

分析:
定义了两个
OUT类型参数,进行过程调用时,
两个参数不会接收传递来的内容,而在过程中如果对两个参数进行修改的话,
则会影响到调用此过程时传递的两个变量的内容;

  • 接上例:定义PL/SQL块调用过程

DECLARE

v_titleA VARCHAR2(100) := '此处只是声明一个接收返回数据的标记';

v_titleB VARCHAR2(100) := '此内容不会传递到过程,但是过程会将修改内容传回' ;

BEGIN

out_proc(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用out_proc()过程之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用out_proc()过程之后变量内容:v_titleB = ' || v_titleB) ;

END ;

/

运行结果:

执行out_proc()过程:p_paramA =

执行out_proc()过程:p_paramB =

调用out_proc()过程之后变量内容:v_titleA = Java开发实战经典

调用out_proc()过程之后变量内容:v_titleB = Android开发实战经典

  • 示例2:定义函数使用OUT模式

CREATE OR REPLACE FUNCTION out_fun(

p_paramA OUT VARCHAR2, -- OUT参数模式

p_paramB OUT VARCHAR2) -- OUT参数模式

RETURN VARCHAR2

AS

BEGIN

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

RETURN 'Oracle开发实战经典' ; -- 返回数据

END ;

/

  • 接上例:编写PL/SQL块调用函数

DECLARE

v_titleA        VARCHAR2(100) := '随便写的,只为接收内容' ;

v_titleB        VARCHAR2(100) := '内容不会传递的' ;

v_return        VARCHAR2(100) ;        -- 接收返回内容

BEGIN

v_return := out_fun(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用out_fun()函数之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用out_fun()函数之后变量内容:v_titleB = ' || v_titleB) ;

DBMS_OUTPUT.put_line('调用out_fun()函数的返回值:v_return = ' || v_return) ;

END ;

/

运行结果:

调用out_fun()函数之后变量内容:v_titleA = Java开发实战经典

调用out_fun()函数之后变量内容:v_titleB = Android开发实战经典

调用out_fun()函数的返回值:v_return = Oracle开发实战经典

  • IN OUT模式
    • 此模式,是前两种模式的结合体。
    • 示例1:定义过程,使用IN OUT参数模式

CREATE OR REPLACE PROCEDURE inout_proc(

p_paramA IN OUT VARCHAR2, -- IN OUT参数模式

p_paramB IN OUT VARCHAR2 ) -- IN OUT参数模式

AS

BEGIN

DBMS_OUTPUT.put_line('执行inout_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行inout_proc()过程:p_paramB = ' || p_paramB) ;

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

END ;

/

  • 接上例:定义PL/SQL块,调用过程

DECLARE

v_titleA VARCHAR2(50) := 'Java WEB开发实战经典';

v_titleB VARCHAR2(50) := 'Oracle开发实战经典' ;

BEGIN

inout_proc(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用inout_proc()过程之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用inout_proc()过程之后变量内容:v_titleB = ' || v_titleB) ;

END ;

/

运行结果:

执行inout_proc()过程:p_paramA = Java WEB开发实战经典

执行inout_proc()过程:p_paramB = Oracle开发实战经典

调用inout_proc()过程之后变量内容:v_titleA = Java开发实战经典

调用inout_proc()过程之后变量内容:v_titleB = Android开发实战经典

分析:
调用过程时,将两个变量的内容传递到了过程中,由于是
IN OUT模式,所以过程可以接受到此变量内容,同时在过程中对变量所做的修改也会返回给实参;

  • 综合示例
    • 利用过程增加部门

CREATE OR REPLACE PROCEDURE dept_insert_proc(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE ,

p_result OUT NUMBER) -- 此为操作标记变量

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ; -- 统计

IF v_deptCount > 0 THEN -- 有此编号的部门

p_result := -1 ; -- 修改返回标记

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

p_result := 0 ; -- 修改返回标记

COMMIT ;

END IF ;

END ;

/

分析:
在此过程中,
result参数声明OUT形式,所以在过程中,对于部门数据的增加成功与否将直接通过result变量返回;

  • 接上例:编写PL/SQL块调用

DECLARE

v_result NUMBER ; -- 接收结果

BEGIN

dept_insert_proc(66,'MLDN','中国',v_result) ; -- 调用过程

IF v_result = 0 THEN

DBMS_OUTPUT.put_line('新部门增加成功!') ;

ELSE

DBMS_OUTPUT.put_line('部门增加失败!') ;

END IF ;

END ;

/

运行结果:
新部门增加成功!
分析:
本程序在调用过程时,除了传递要增加的部门信息之外,也传递了一个
v_result变量,

同时此变量将作为增加操作成功与否的标记返回给过程调用处

  • 示例2:以上示例是通过PL/SQL块进行的过程调用,下面通过定义变量的方式来接收过程的返回值
    • 定义变量调用过程返回

var v_result NUMBER ;

EXEC dept_insert_proc(50,'微软','北京',:v_result) ;

print v_result ;

运行结果:0
分析:
利用
print输出了变量的内容,由于数据增加成功,执行过程之后v_result变量的内容为0,反之是1

  • 示例3:通过函数来做示例1

CREATE OR REPLACE FUNCTION dept_insert_fun(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE)

RETURN NUMBER -- 返回操作结果

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ; -- 统计

IF v_deptCount > 0 THEN -- 有此编号的部门

RETURN -1 ; -- 返回失败标记

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

COMMIT ;

RETURN 0 ; -- 返回成功标记

END IF ;

END ;

/

分析:
函数的定义与过程类似,不同的是,函数可以直接返回操作结果。
不需要像过程那样,通过
OUTIN OUT参数模式传递

  • 接上例:

DECLARE

v_result NUMBER ; -- 接收结果

BEGIN

v_result := dept_insert_fun(63,'MLDNJAVA','中国') ; -- 调用函数

IF v_result = 0 THEN

DBMS_OUTPUT.put_line('新部门增加成功!') ;

ELSE

DBMS_OUTPUT.put_line('部门增加失败!') ;

END IF ;

END ;

/

运行结果:
新部门增加成功!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值