子程序

本文介绍了Oracle中的子程序,包括过程和函数的定义语法,并详细解析了参数模式IN、OUT和IN OUT的使用,通过实例展示了如何在过程和函数中应用这些参数模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
RETURN ‘MySQL实战课程’ ;
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 ;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值