Oracle表类型为嵌套表转换错误

时间:2015-04-07 15:35:25

标签: oracle plsql oracle11g oracle10g

我声明了表类型并使用循环在其中设置了一个值。我在施放此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

祝你好运

2 个答案:

答案 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。上面的代码已更新为原始处理查询的结果。