oracle中in和的区别吗,Oracle中“IN”和“IN OUT”CURSOR参数之间的区别

在您从手册中引用的文本中,请注意它是专门讨论“从光标变量获取的子程序”。你的例子都没有这样做,因此引用与它们无关。

但是,如果子程序打开并从游标变量中取出,那么在这种情况下使用OUT似乎没有任何问题:

SQL> variable c refcursor

SQL> set serveroutput on

SQL> create or replace procedure no_good (c OUT sys_refcursor)

2 as

3 my_dummy dual.dummy%type;

4 begin

5 open c for select dummy from dual union all select dummy from dual;

6 fetch c into my_dummy;

7 dbms_output.put_line( my_dummy );

8 end;

9 /

Procedure created.

SQL> exec no_good( :c )

X

PL/SQL procedure successfully completed.

SQL> print c

D

-

X

我认为该文本实际上试图使两个点彼此独立。首先,如果要将任何已打开的游标变量传递到子程序中,该子程序将从中获取,则该参数必须声明为IN或IN OUT。其次,如果要将游标变量传递给子程序,然后将其打开,则必须将参数声明为OUT或IN OUT。无论您是否真的关心将游标变量的值传递回调用者,都是如此:

SQL> create or replace procedure no_good (c IN sys_refcursor)

2 as

3 my_dummy dual.dummy%type;

4 begin

5 open c for select dummy from dual;

6 fetch c into my_dummy;

7 dbms_output.put_line( my_dummy );

8 close c;

9 end;

10 /

Warning: Procedure created with compilation errors.

SQL> show error

Errors for PROCEDURE NO_GOOD:

LINE/COL ERROR

-------- -----------------------------------------------------------------

5/6 PL/SQL: SQL Statement ignored

5/11 PLS-00361: IN cursor 'C' cannot be OPEN'ed

可以通过更改参数模式来修复此错误,但实际上简单地将游标变量设置为局部变量而不是参数似乎更有意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle,游标可以通过以下语法来定义: ``` CURSOR cursor_name IS select_statement; ``` 其,`cursor_name`是游标的名称,`select_statement`是用于查询数据的SQL语句。在你所提到的存储过程,`CUR_USERITEMLIST`应该是一个自定义的游标类型,因此需要先定义这个游标类型,然后再在存储过程使用。 以下是定义`CUR_USERITEMLIST`游标类型的示例代码: ``` CREATE OR REPLACE TYPE CUR_USERITEMLIST AS OBJECT ( item_id NUMBER, item_name VARCHAR2(100), item_price NUMBER ); / CREATE OR REPLACE TYPE CUR_USERITEMLIST_TABLE AS TABLE OF CUR_USERITEMLIST; / ``` 上述代码定义了一个`CUR_USERITEMLIST`对象类型和一个`CUR_USERITEMLIST_TABLE`表类型,后者用于存储多个`CUR_USERITEMLIST`类型的对象。 接下来,在存储过程定义`cur_userItemList`游标参数时,可以使用以下语法: ``` PROCEDURE my_proc(cur_userItemList OUT CUR_USERITEMLIST_TABLE) IS my_cursor CURSOR FOR SELECT item_id, item_name, item_price FROM items WHERE user_id = cur_user_id; my_items CUR_USERITEMLIST_TABLE := CUR_USERITEMLIST_TABLE(); BEGIN OPEN my_cursor; LOOP FETCH my_cursor BULK COLLECT INTO my_items LIMIT 100; EXIT WHEN my_items.COUNT = 0; cur_userItemList := cur_userItemList MULTISET UNION ALL my_items; END LOOP; CLOSE my_cursor; END; ``` 在上述存储过程,通过`CURSOR FOR`语法定义了一个游标`my_cursor`,用于查询`items`表指定用户的商品列表。`BULK COLLECT`语法用于一次性获取多条记录,并将它们存储到一个数组。最后,使用`MULTISET UNION ALL`将多个`CUR_USERITEMLIST`对象合并成一个`CUR_USERITEMLIST_TABLE`类型的参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值