ORA-06504: PL/SQL: Return types of Result Set variables while execution
我创建了一个如下的对象和过程,执行时出现以下错误。
ORA-06504: PL/SQL: Return types of Result Set variables or query do
not match ORA-06512: at line 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | CREATE OR REPLACE TYPE OBJ_TST AS OBJECT ( COl_ID NUMBER (30, 0), Col_DATE TIMESTAMP (6) ); / CREATE OR REPLACE TYPE OBJ_TBL AS TABLE OF OBJ_TST; / CREATE OR REPLACE PROCEDURE TST_OBJ (input_date IN DATE, out_cur OUT SYS_REFCURSOR ) AS l_tab OBJ_TBL := OBJ_TBL (); BEGIN SELECT OBJ_TST (ti.col_id, ti.col_date) BULK COLLECT INTO l_tab FROM MY_TBL ti WHERE ti.create_date BETWEEN input_date AND input_date + 1; OPEN o_cur FOR SELECT col_id,col_date FROM TABLE(l_tab); END TST_OBJ; / |
执行给我带来了上述错误。 MY_TBL 的列数据类型(col_id 和 col_date)与我的对象相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
ORA-06504: PL/SQL: Return types of Result Set variables or query do
not match ORA-06512: at line 8
但是,当我这样执行时,它可以正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
谁能建议这里有什么问题?
您正在使用表集合表达式来取消嵌套表集合:
查询返回两个关系列,而不是单个对象,因此您的光标也有两列。尝试将两个关系列批量收集到匿名块中的单个对象中会引发异常。
我想你可以将它们重新组合为对象:
或者如果您不想明确列出列/字段名称:
但是在您的示例中,表类型有点毫无意义,您可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 |
但我认为您对函数内部的集合还有其他用途 - 在查询和返回之前对其进行修改。或者您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
游标
为什么要使用游标:
1 2 3 4 5 6 7 8 9 10 11 12 |
那么你可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 |