从ref cursor到嵌套表中获取数据时出错。这就是我正在做的事情。
对象和表类型:
CREATE OR REPLACE TYPE obj_report_org IS OBJECT
(dummy1 VARCHAR2(50),
dummy2 VARCHAR2(50),
dummy3 VARCHAR2(50),
dummy4 NUMBER(10));
CREATE OR REPLACE TYPE tab_report_org IS TABLE OF obj_report_org;
步骤:
CREATE OR REPLACE PROCEDURE areaReport_test(v_name1 VARCHAR2,
v_name2 VARCHAR2, tab_report_set OUT tab_report_org)
IS
str VARCHAR2(2000);
v_num NUMBER := 1;
recordset SYS_REFCURSOR;
lv_tab_report_set tab_report_org := tab_report_org();
BEGIN
str := ' SELECT tab2.dummy1 ,tab3.dummy2,tab2.dummy3,tab1.dummy4 '||
' FROM tab1,tab2, tab3, tab4'||
' WHERE <JOIN CONDITIONS>';
OPEN recordset FOR
str||' START WITH tab1.name = :name1'||
' CONNECT BY PRIOR tab1.id = tab1.parent_id'||
' UNION '||
str||' START WITH tab1.name = :name2'||
' CONNECT BY PRIOR tab1.id = tab1.parent_id'
USING v_name1,v_name2;
FETCH recordset BULK COLLECT into lv_tab_report_set;
CLOSE recordset;
tab_report_set := lv_tab_report_set;
END;
然后我有一个匿名块来调用该过程:
DECLARE
l_tab_report_set tab_report_org;
BEGIN
areaReport_test('PRASHANT',null,l_tab_report_set);
FOR i in 1 .. l_tab_report_set.count
LOOP
DBMS_OUTPUT.PUT_LINE(
l_tab_report_set(i).dummy1|| ' | ' ||
l_tab_report_set(i).dummy2|| ' | ' ||
l_tab_report_set(i).dummy3|| ' | ' ||
l_tab_report_set(i).dummy4|| );
END LOOP;
END;
运行匿名阻止后,我收到此错误:
ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "AREAREPORT_TEST", line 36
ORA-06512: at line 5
00932. 00000 - "inconsistent datatypes: expected %s got %s"
似乎我们无法将数据批量获取到由SQL对象形成的嵌套表中。而对象中的字段序列和数据类型与select查询匹配。
请告知。
答案 0 :(得分:2)
我将从底部开始:
FETCH recordset BULK COLLECT into lv_tab_report_set;
您正在获取对象表中的记录集。因此,记录集应包含对象列表。
SELECT tab2.dummy1 ,tab3.dummy2,tab2.dummy3,tab1.dummy4...
它是列的列表而不是对象。这是一个对象列表:
select obj_report_org(tab2.dummy1 ,tab3.dummy2,tab2.dummy3,tab1.dummy4) ...
关于一般代码的一些评论
当你使用UNION而不是UNION ALL时,Oracle会对两个结果进行排序并消除重复(没有其他方法可以做到这一点)。所以,只要想想你是否真的需要UNION,并记住它有代价。
你UNION两个看似可以组合在一起的数据集
START WITH tab1.name in (:name1, :name2)
在ORA-22950之后继续
你是不是在命令你的元素,但是ORACLE如何知道如何对它们进行排序? 通过dummy1或dummy2或......?
你必须选择:
不要使用排序
这基本上意味着没有DISTINCT,GROUP BY,ORDER BY和没有UNION(你可以使用UNION ALL)
define为您的对象排序
跟进ORACLE类型中的方法
您的oracle类型可以有其他方法,其中一些是特殊的,通知&#39;订购会员功能&#39;下面(从link复制):
<!-- language: pl/sql -->
CREATE OR REPLACE TYPE location_typ AS OBJECT (
building_no NUMBER,
city VARCHAR2(40),
ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER
);
/
CREATE OR REPLACE TYPE BODY location_typ AS
ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS
BEGIN
IF building_no < l.building_no THEN
RETURN -1; -- any negative number will do
ELSIF building_no > l.building_no THEN
RETURN 1; -- any positive number will do
ELSE
RETURN 0;
END IF;
END;
END;/
答案 1 :(得分:-2)
这不是获取其数据类型不匹配的问题。打开游标和提取是正确的。