2011-08-02 39 views
1

谷歌搜索再多似乎找到了答案,这一个...填充光标与行类型变量

我试图修改甲骨文存储过程是目前拉动值了一些表,并将其移动到其他表格。

它是这样定义的ROWTYPE变量:

myRow my_tbl%ROWTYPE; 

眼下,存储过程不用于填充行类型变量,然后用它来填充一个表中的一些逻辑:

INSERT INTO MY_TBL 
( col1, 
    col2, 
    col3, 
    -snip- 
) 
VALUES (
    myRow.aValue, 
    myRow.aValue2, 
    myRow.aValu3, 
    -snip- 
) 

而不是填充表,我想使用ROWTYPE来填充返回到Web应用程序的游标。但是,我无法找到一种方法来执行此ROWTYPE - > REF CURSOR转换。这可能吗?如果没有,是否有办法用来自各种表格的数据并使用一些复杂的逻辑来手动填充游标?我正在使用Oracle 10g。

谢谢!

回答

3

关于这一点的棘手部分是,您正在使用REF CURSOR,该参数用于一组行以仅为单行返回数据。我想你只是这样做,因为你的web应用程序理解ref游标,以及如何从Oracle获取它们,但不是对象类型。我也猜测出于某种原因,你不能只是写一个单一的select语句来根据需要检索和操作数据(这是最简单的方法,所以有了更多的信息,我们可以帮助你实现它)。

我可以想到有几种方法可以做到这一点,它们都不是很漂亮,所以希望别人能够用更好的想法加以注意。

1)由双

DECLARE 
    refcur SYS_REFCURSOR; 
    myRow TBL%ROWTYPE; 
BEGIN 
    myRow.aValue := 1; 
    myRow.aValue2 := 3; 
    myRow.aValue3 := 5;  
    OPEN refcur 
    FOR 
     select 
      myRow.aValue, 
      myRow.aValue2, 
      myRow.aValue3 
     from 
      dual; 
    CLOSE refcur; 
END; 

2)创建返回你的行类型的表中的流水线功能选择你的计算变量创建光标,并从该功能的选择创建您的光标。

+0

是一个很好的书面记录......我们只是光标一起工作。从理论上讲,我可以用一个怪物查询来做到这一点,但它会很难看!我希望能够分解一点。在这种情况下,“从双重选择”语法看起来会是什么样子? –

+0

我已经添加了一个从双语法中选择样子的例子。 – Craig

+0

在现实生活中,我们不会关闭游标,我们会通过它或将其返回给消费者。 – APC

0

的选择从双会像

select myRow.aValue, 
     myRow.aValue2, 
     myRow.aValu3 
from dual; 

你应该能够声明游标这一点。

有REF CURSOR在http://psoug.org/reference/ref_cursors.html

+0

你可以发表一些关于游标声明应该如何的代码吗?它应该是什么类型?你如何获得游标的值? –

+0

我为你添加了一个链接。 –