【发布时间】:2020-05-07 23:48:31
【问题描述】:
我想从 refcursor 创建记录。我的代码:
set serveroutput on
DECLARE
c_curs SYS_REFCURSOR;
v_id NUMBER;
BEGIN
pck_prov.get_value_type_list (1, c_curs); --> procedure called here
-- I guess this is the place where record can be created from cursor.
LOOP
FETCH c_curs
INTO v_id;--instead of fetching into variable I would like to fetch into row
EXIT WHEN c_curs%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_id);--if fetching is done into row, only selected columns can be printed, like myrow.id
END LOOP;
CLOSE c_curs;
END;
请注意:我知道如何从使用 select 语句定义的游标创建记录,如 here 所述。我不知道如何对 refcursors 使用相同的技术。
编辑:
来自here 的代码正是我所需要的,但它会引发错误:
set serveroutput on
VAR c_curs refcursor;
EXECUTE pck_prov.get_value_type_list(1, :c_curs);
BEGIN
FOR record_test IN :c_curs LOOP
dbms_output.put_line(record_test.id);
END LOOP;
END;
错误:错误 PLS-00456:项目 'SQLDEVBIND1Z_1' 不是游标。
只是为了澄清问题:
在我的数据库中大约有 200 个包。 每个包内部都有几个存储过程 - 通常每个过程都与来自不同表的列组合在一起。这就是为什么最好有一些动态创建的光标,这样我就可以像我发布的示例一样进行简单的选择。
【问题讨论】:
-
我认为您在这里对变量和行有误。该变量将仅保存游标单列的单个值。因此,如果您的光标返回 3 列,那么您需要声明 3 个变量
INTO v_id, name, dept。那你提的和DBMS_OUTPUT.PUT_LINE(v_id || ', ' || name || ', ' || dept)一样@ -
@LalitKumarB - 是的,我明白这一点。我的问题是我有存储过程,它从不同的表中返回超过 50 列。我只需要展示其中的一些。这就是为什么提取从游标创建的行会容易得多。
-
这可能取决于您想要记录的内容。 PL/SQL 记录不能有直到运行时才知道的定义,但可以有 XML、JSON、CSV 等。