从ref游标提取数据到嵌套表时,数据类型不一致



在从ref游标获取数据到嵌套表时出现错误。这就是我正在做的。

对象和表类型:

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 query匹配。

请建议。

我将从底部开始:

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,并记住这是有代价的。

你联合两个数据集,看起来可以组合在一起

START WITH tab1.name in (:name1, :name2)

在ORA-22950之后继续

你隐式排序你的元素,但是ORACLE怎么知道如何排序它们?被dummy1还是dummy2还是…?

你必须选择:

  1. 不使用排序

    这基本上意味着没有DISTINCT, GROUP BY, ORDER BY和UNION(你可以使用UNION ALL)

  2. 定义对象排序


跟踪ORACLE类型中的方法

您的oracle类型可以有额外的方法,其中一些是特殊的,请注意下面的'ORDER MEMBER FUNCTION'(从链接复制):

<!-- 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;/

这不是数据类型不匹配的问题。打开游标和抓取是正确的,你写的

最新更新