我声明了表类型并使用循环在其中设置了一个值。我在施放此t_table时遇到错误
DECLARE
TYPE t_row IS RECORD
(
id NUMBER,
description VARCHAR2(50)
);
TYPE t_table IS TABLE OF t_row;
l_tab t_table := t_table();
BEGIN
FOR i IN 1 .. 10 LOOP
l_tab.extend();
l_tab(l_tab.last).id := i;
l_tab(l_tab.last).description := 'Description for ' || i;
END LOOP;
SELECT * from TABLE(CAST(l_tab AS t_table));
END
祝你好运
答案 0 :(得分:1)
为什么要对该类型进行选择?如果您在表格中存储了一个集合,则可以使用TABLE()
和CAST
。
您可以在代码中遍历表格。例如:
for i in l_tab.first .. l_tab.last
loop
dbms_output.put_line(l_tab(i).id||' '||l_tab(i).description);
end loop;
答案 1 :(得分:0)
由于l_tab
的类型为t_table
,因此不需要cast
。但那不是你的问题。
您的问题是您尝试在SQL中引用PL / SQL类型,而您根本无法做到这一点。您可以删除select
作为@hol建议,或者将类型设置为数据库对象(这将允许SQL访问它):
CREATE OR REPLACE TYPE t_row AS OBJECT
(
id NUMBER,
description VARCHAR2 (50)
);
CREATE OR REPLACE TYPE t_table AS TABLE OF t_row;
DECLARE
l_tab t_table := t_table ();
BEGIN
FOR i IN 1 .. 10 LOOP
l_tab.EXTEND ();
l_tab (l_tab.LAST) := t_row (i, 'Description for ' || i);
END LOOP;
FOR r IN (SELECT * FROM TABLE (l_tab)) LOOP
DBMS_OUTPUT.put_line (r.id);
END LOOP;
END;
初始代码存在第二个问题,因为您正在运行select
而不告诉代码如何处理它。与其他一些过程SQL扩展不同,PL / SQL不允许您隐式返回结果集的句柄(在12c之前)。您必须直接处理它或显式返回指向它的ref_cursor
。上面的代码已更新为原始处理查询的结果。