oracle - 如何返回 pl/sql 表的游标

标签 oracle plsql

我从几个表中选择数据。然后我需要在返回之前编辑从光标返回的数据。然后光标将被传递到 perl 脚本以显示行。

为此,我构建了一个 pl/sql 表,如以下代码所示。我需要知道的是如何将其返回到该表?

目前我收到错误“表或 View 不存在”。我用于简单表格的测试代码附在此处。

CREATE OR REPLACE FUNCTION test_rep
RETURN SYS_REFCURSOR
AS

CURSOR rec_Cur IS 
    SELECT  table1.NAME, 
        table1.ID 
    FROM TESTREPORT table1;
TYPE rec_Table IS TABLE OF rec_Cur%ROWTYPE INDEX BY PLS_INTEGER;
working_Rec_Table rec_Table;    

TYPE n_trade_rec IS RECORD
(
    NAME    VARCHAR2(15), 
    ID      NUMBER
);
TYPE ga_novated_trades IS TABLE OF n_trade_rec index by VARCHAR2(15);
va_novated_trades    ga_novated_trades;
v_unique_key VARCHAR2(15);

TYPE db_cursor IS REF CURSOR;
db_cursor2 db_cursor; 

BEGIN

    OPEN rec_Cur;
    FETCH rec_Cur BULK COLLECT INTO working_Rec_Table;

    FOR I IN 1..working_Rec_Table.COUNT LOOP
        v_unique_key := working_Rec_Table(I).NAME;
        va_novated_trades(v_unique_key).NAME    := working_Rec_Table(I).NAME;
        va_novated_trades(v_unique_key).ID      := working_Rec_Table(I).ID;
     END LOOP; --FOR LOOP

     OPEN db_cursor2 FOR SELECT * FROM va_novated_trades; --ERROR LINE

     CLOSE rec_Cur;
     RETURN db_cursor2;

END test_rep;
/

最佳答案

基本上有一种方法可以使用TABLE()函数在oracle中选择表类型

SELECT * FROM table(va_novated_trades);

但这仅适用于schema表类型和plsql表(在SCHEMA中定义的表类型,而不是在plsql包中定义的表类型):

CREATE TYPE n_trade_rec AS OBJECT
(
    NAME    VARCHAR2(15), 
    ID      NUMBER
);
CREATE TYPE ga_novated_trades AS TABLE OF n_trade_rec;

但我仍然认为你应该尝试在查询中(和/或在 perl 脚本中)完成这一切,

For example, there is one field where i have to analyse the 4th character and then edit other fields accordingly

这可以在查询中实现,可能类似于:

select case when substr(one_field, 4, 1) = 'A' then 'A.' || sec_field
            when substr(one_field, 4, 1) = 'B' then 'B.' || sec_field
            else sec_field 
       end as new_sec_field,
       case when substr(one_field, 4, 1) = 'A' then 100 * trd_field
            when substr(one_field, 4, 1) = 'B' then 1000 * trd_field
            else trd_field 
       end as new_trd_field,
       -- and so on
from TESTREPORT

关于oracle - 如何返回 pl/sql 表的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11150595/

相关文章:

java - ORA-02396 : exceeded maximum idle time, 请重新连接

java - 甲骨文。使用 LDAP 进行身份验证始终返回 -16

oracle - 是否可以对对象类型的表执行选择?

java - Spring在JDBCTemplate中对异常处理的实现

plsql - PL/SQL 过程 CURSOR For 循环

sql - 只需要从 INNER JOIN 返回一行

java - oracle.net.ns.NetException : Socket read timed out

java - 为什么这个 hibernatetemplate 批量更新不起作用

oracle - PL/SQL 存储过程的测试脚本

oracle - Oracle中触发器的BEGIN语句后可以声明CURSOR吗?