-
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 ; / | 分析: |
- 接上例:定义一个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开发实战经典 |
- 示例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; / | 分析: 然后在函数中将返回一个字符串给函数调用处 |
- 接上例:编写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 ; / | 运行结果: |
-
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 ; / | 分析: |
- 接上例:定义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开发实战经典 分析: |
-
综合示例
- 利用过程增加部门
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 ; / | 分析: |
- 接上例:编写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 ; / | 运行结果: 同时此变量将作为增加操作成功与否的标记返回给过程调用处 |
-
示例2:以上示例是通过PL/SQL块进行的过程调用,下面通过定义变量的方式来接收过程的返回值
- 定义变量调用过程返回
var v_result NUMBER ; EXEC dept_insert_proc(50,'微软','北京',:v_result) ; print v_result ; | 运行结果:0 |
- 示例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 ; / | 分析: |
- 接上例:
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 ; / | 运行结果: |