子程序
oracle为了方便管理这些代码块,往往会将其封装到一个特定的结构体之中,这样的结构体在Oracle之中就被称为子程序
在Oracle中子程序分为两种:过程、函数
过程定义语法
CREATE [OR REPLACE] PROCEDURE 过程名称([参数名称 [参数模式]NOCOPY 数据类型 [,参数名称 [参数模式] NOCOPY 数据类型 , ….]])[AUTHID [defineR | CURRENT_USER]]
AS | IS
[pragma AUTONOMOUS_transaction ;]
声明部分 ;
BEGIN
程序部分 ;
EXCEPTION
异常处理 ;
END;
/
函数定义语法:
CREATE [OR REPLACE] FUNCTION 函数名([参数 , [参数 , …]])
RETURN 返回值类型
[AUTHID {DEFINER | CURRENT_USER}]
AS | IS
[PRAGMA AUTONOMOUS_TRANSACTION ;]
声明部分 ;
BEGIN
程序部分 ;
[RETURN 返回值 ;]
[EXCEPTION
异常处理]
END [函数名] ;
/
参数模式
在定义子程序时往往需要接收传递的参数,这样对于形式参数的定义就分为了三类:IN、OUT和IN OUT模式,此三类形式定义如下:
IN (默认,数值传递):在子程序之中所做的修改不会影响原始参数内容;
OUT (空进带值出):不带任何数值传到子程序之中,子程序可以通过此变量将数值返回给调用处;
IN OUT (地址传递):可以将值传到子程序之中,同时也会将子程序之中对变量的修改返回到调用处。
in模式
过程使用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 ;
/
DECLARE
v_titleA VARCHAR2(50) := ‘OCP课程’;
v_titleB VARCHAR2(50) := ‘OCM课程’ ;
BEGIN
in_proc(v_titleA , v_titleB) ;
END ;
/
函数使用IN参数模式
CREATE OR REPLACE FUNCTION in_fun(p_paramA IN VARCHAR2 ,p_paramB VARCHAR2 DEFAULT ‘Oracle实战课程’)RETURN VARCHAR2
AS
BEGIN
END;
/
DECLARE
v_titleA VARCHAR2(50) := ‘OCM课程’;
v_return VARCHAR2(50) ;
BEGIN
v_return := in_fun(v_titleA) ;
DBMS_OUTPUT.put_line('in_fun()函数返回值:v_return = ’ || v_return) ;
END ;
/
OUT模式
函数使用out参数模式
CREATE OR REPLACE FUNCTION out_fun(p_paramA OUT VARCHAR2, – OUT参数模式
p_paramB OUT VARCHAR2) – OUT参数模式 RETURN VARCHAR2
AS
BEGIN
p_paramA := ‘OCP考试’ ; – 此值将返回给实参
p_paramB := ‘OCM考试’ ; – 此值将返回给实参
RETURN ‘Oracle实战课程’ ; – 返回数据
END ;
declare
v_a varchar2(20);
v_b varchar2(20);
v_rul varchar2(20);
begin
v_a:=‘a’;
v_b:=‘b’;
v_rul:=out_fun(v_a,v_b);
dbms_output.put_line(v_a||v_b||v_rul);
end;
过程使用out参数模式
CREATE OR REPLACE PROCEDURE out_proc(p_paramA OUT VARCHAR2, – OUT参数模式p_paramB OUT VARCHAR2) – OUT参数模式
AS
BEGIN
DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramA = ’ || p_paramA) ;
DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramB = ’ || p_paramB) ;
p_paramA := ‘OCP考试’ ; – 此值将返回给实参
p_paramB := ‘OCM考试’ ;-- 此值将返回给实参
END ;
/
declare
v_a varchar2(20);
v_b varchar2(20);
begin
v_a:=‘a’;
v_b:=‘b’;
out_proc(v_a,v_b);
end;
过程使用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 := ‘OCP课程’ ; – 此值将返回给实参
p_paramB := ‘OCM课程’ ; – 此值将返回给实参
END ;
/
declare
v_titleA VARCHAR2(50) := ‘Oracle实战课程’;
v_titleB VARCHAR2(50) := ‘MySQL实战课程’ ;
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 ;
/
in表示传入参数有效果
out表示传入参数无效
in out既可以传入也可以穿出参数
在输出时
过程:设置的变量与参数数量一致
例如:
函数:设置的变量与函数连接起来
例如:
CREATE OR REPLACE FUNCTION get_salary_fun(p_eno emp.empno%TYPE)
RETURN NUMBER
AS
v_salary emp.sal%TYPE ;
BEGIN
SELECT sal + nvl(comm,0) INTO v_salary FROM emp WHERE empno=p_eno ;
RETURN v_salary ;
END;
/
DECLARE
v_salary NUMBER ;
BEGIN
v_salary := get_salary_fun(7369) ;
DBMS_OUTPUT.put_line(‘雇员7369的工资为:’ || v_salary) ;
END ;
/