Oracle 子程序参数模式主要有IN,OUT,NOCOPY,IN和OUT可以组合,OUT和NOCOPY也可以组合使用.
IN主要用于传入参数,可以是变量,常量,表达式,在子程序内部不能改变其值.
DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER) IS
BEGIN
dbms_output.put_line(n1); -- prints 10
--n1:=20; --illegal assignment.
END;
BEGIN
do_something(n);
do_something(20);
END;
OUT模式用于返回值,必须传入变量调用,变量的初始的值不会传给形式参数,如<<1>>所示.
形参的值在子程序返回时(不是在形式参数改变时)才copy给实参,,如<<2>>所示,如果在返回之前发生异常,实际参数的值不会被改变.
DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 OUT NUMBER) IS
BEGIN
dbms_output.put_line('before assign: ' || n1); -- prints none <<1>>
n1:=20;
dbms_output.put_line('before return: ' || n); -- prints 10 <<2>>
END;
BEGIN
do_something(n);
dbms_output.put_line('after return: ' || n); -- prints 20
END;
NOCOPY模式用于限定OUT模式在调用时是不是以传引用的方式进行(它只是一个编译器暗示,不一定总是起作用),默认情况下,OUT模式的参数是以传值的方式进行调用的.
IN主要用于传入参数的,虽然n2 := 20被调用,但是要到返回的时候才生效.如<<1>>所示.
NOCOPY是传引用,会在赋值的时候立即生效,如<<2>>所示,如果在返回之前发生异常,实际参数的值也会被改变<<See exception test>>.
由于OUT参数在子程序返回的时候会将值copy到实际参数,所以调用完后n的值为20,如<<3>>所示.
DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER,
n2 IN OUT NUMBER,
n3 IN OUT NOCOPY NUMBER) IS
BEGIN
n2 := 20;
dbms_output.put_line(n1); -- prints 10<<1>>
n3 := 30;
dbms_output.put_line(n1); -- prints 30 <<2>>
END;
BEGIN
do_something(n, n, n);
dbms_output.put_line(n); -- prints 20 <<3>>
END;
exception test:
DECLARE
N NUMBER := 10;
PROCEDURE DO_SOMETHING(N3 IN OUT NUMBER) IS
BEGIN
N3 := 30;
DBMS_OUTPUT.PUT_LINE(N3);
RAISE_APPLICATION_ERROR(-1, 'Exception ccurred!');
END;
BEGIN
DO_SOMETHING(N);
EXCEPTION
WHEN OTHERS THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Error Code: ' || SQLCODE);
END;
DBMS_OUTPUT.PUT_LINE(N);
END;
分享到:
相关推荐
总结起来,Oracle 子程序参数模式IN、OUT和NOCOPY提供了灵活的数据传递机制,IN用于单向传递数据,OUT用于传出结果,而NOCOPY则是在OUT基础上尝试优化性能的一种方式,允许子程序直接修改调用者的变量。了解和正确...
Oracle PL/SQL 子程序和包的概念和应用 本章要点: * 理解子程序(过程、函数)及包的概念 * 掌握如何创建、执行和删除过程、函数及包的方法 * 了解形参和实参的区别以及不同参数模式的特征 * 灵活使用过程、函数...
ac_Connection in out Nocopy Connection ); Procedure p_SendFTPCmd( ac_Connection in out Nocopy Connection, as_Command in VarChar2, as_Argument in VarChar2 Default Null, as_...
- 子程序可以接受参数,并可以通过参数模式(IN, OUT, IN OUT)控制数据流向。 6. **游标** - 游标用于处理SQL查询结果集,通过DECLARE声明,OPEN打开,FETCH获取数据,CLOSE关闭来操作游标。 - FOR LOOP结构...
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT NOCOPY string_sum_obj, v_next IN string_sum_obj) RETURN NUMBER, -- 结束时调用的函数 MEMBER FUNCTION ODCIAggregateTerminate(self IN string_sum_obj, ...
geometry IN OUT NOCOPY MDSYS.SDO_GEOMETRY, from_srs_id IN NUMBER, to_srs_id IN NUMBER ) ``` - `geometry`: 需要转换的几何对象。 - `from_srs_id`: 当前几何对象所在的坐标系统ID。 - `to_srs_id`: 目标...
标题 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换成按址调用)。 标题 软件包及封装 软件包(PACKAGE)的建立和调用 软件包的全局结构 封装函数的纯度 标题 查看源代码及...
【计算机软件及应用应用程序结构】中的知识点主要围绕PL/SQL的子程序展开,包括子程序的概念、分类、优点、创建方法以及相关的参数模式。以下是详细的解释: 1. **子程序**:在PL/SQL中,子程序指的是过程和函数。...
ac_Conn in Out Nocopy UTL_SMTP.Connection, as_Boundary in VarChar2, as_Encode in VarChar2 Default 'base64', as_SignatureLogo in VarChar2 Default Null, as_SignatureText in VarChar2 ...
parameter_list IN OUT NOCOPY PARAM_LIST, return_code OUT NUMBER, return_message OUT VARCHAR2); ``` 其中,`report_name`是报表的名称,`parameter_list`用于传递报表所需的参数,`return_code`和`...
- **参数模式**:参数可以是`IN`(只读)、`OUT`(只写)或`IN OUT`(读写)。 - **值传递**:参数值可以从调用者传入子程序,也可以从子程序传出。 - **异常处理**:子程序内部的异常需要在异常处理段中进行处理...
- `NOCOPY`:当参数类型为`INOUT`时,使用`NOCOPY`关键字可避免复制参数的值,从而节省内存资源。 - **权限管理**: - `AUTHID CURRENT_USER`:表示存储过程内的操作权限与当前执行用户相同。 - `AUTHID DEFINER...
在处理子程序参数时,我们需要考虑参数模式(IN、OUT、IN OUT),如何传递值,以及可能的异常处理。参数可以按值传递,此时传递的是参数值的副本,对参数的修改不会影响原始值;按引用传递时,参数变化会影响原始值...
通常,参数有`IN`、`OUT`和`NOCOPY`三种模式。`IN`参数只用于传入,内部无法修改;`OUT`参数用于返回值,需要传入变量;而`NOCOPY`修饰符则允许直接传递参数的地址,从而减少CPU和内存的开销。通过使用`NOCOPY`,...
- 在存储过程中使用OUT参数来明确指示哪些变量将用于返回值。 - **变量对应表字段**: - 变量命名应与所对应的表字段保持一致,以便于理解和维护。 - **常量使用**: - 使用常量来代替硬编码的值,增加代码的灵活...
- **INOUT:** 可读写参数。 - **NOCOPY:** 标志,表明参数不应被复制。 - **AUTHID:** 定义执行权限类型。 **示例:** ```sql CREATE OR REPLACE PROCEDURE sam.credit ( acc_no IN NUMBER, amount IN NUMBER...
**NOCOPY的作用**:即使不显式使用`IN`模式,参数也会按照地址传递。这意味着当参数大小较大时,使用`NOCOPY`可以带来明显的性能提升。 #### 三、其他高级调优技术 除了上述基本的编程技巧外,还有一些高级技术可以...
1. 创建结构数据消息处理器:`SQL> create or replace procedure enq_jms_lcr(lcr in dbms_streams.aq$_lcr, payload out nocopy dev_payload) is begin payload.table_name := lcr.object_name; payload.operation ...