PL / SQL:ORA-00907:批量收集错误

问题描述 投票:0回答:2

有没有办法我们使用distinct和别名(as)来实现批量收集查询,如下所示。

SELECT  distinct OBJ_TEST  ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;
oracle plsql plsqldeveloper bulk-collect
2个回答
2
投票

有没有办法我们使用distinct&alias(as)来实现批量收集查询,如下所示。

不确定为什么要使用别名,因为在bulk collect中使用别名并使用它是没有意义的。您将始终必须使用您定义的对象的column names。请参阅下文并阅读我的内联评论:

    CREATE OR REPLACE TYPE OBJ_TEST AS OBJECT ( EMP_ID NUMBER(10), EMP_NAME VARCHAR2(100) ) ;

    /
    CREATE OR REPLACE TYPE V_OBJ_TYP IS TABLE OF OBJ_TEST;
    /

    CREATE TABLE TMP_EMP  ( EMP_ID NUMBER(10), EMP_NAME VARCHAR2(100) );
    /

    INSERT INTO TMP_EMP  VALUES (1,        'XXX');
    INSERT INTO TMP_EMP  VALUES (2,        'HHH');
    INSERT INTO TMP_EMP  VALUES (3,        'ZZZ');
    INSERT INTO TMP_EMP  VALUES (4,        'YYY');
    /
    COMMIT;
    /

    DECLARE
         LVOB_TEST                     V_OBJ_TYP;
    BEGIN
        --See below how you can use the alias but it doesnot make sense 
        --since you cannot use the alias name while displaying the result using alias name.
         SELECT OBJ_TEST (EP_ID, E_NAME)
         BULK COLLECT INTO LVOB_TEST
           FROM (SELECT DISTINCT EMP_ID AS EP_ID, 
                                 EMP_NAME AS E_NAME
                            FROM TMP_EMP);

         DBMS_OUTPUT.PUT_LINE ('EMP_ID'||'--' ||'EMP_NAME');

         FOR I IN 1 .. LVOB_TEST.COUNT
         LOOP   
          --Here am displaying the result of the query. But i cannot use alias since i need can only refer the name of the columns defined in the Object. i.e. EMP_ID & EMP_NAME. 
          --IF you want to use that alias then create the object with that alias name.      
              DBMS_OUTPUT.PUT_LINE (LVOB_TEST (I).EMP_ID ||'--' ||LVOB_TEST (I).EMP_NAME );
         END LOOP;
    END;

输出:

SQL> /
EMP_ID--EMP_NAME
4--YYY
2--HHH
3--ZZZ
1--XXX

PL/SQL procedure successfully completed.

0
投票

你对细节非常了解,但猜测一下,你想:

SELECT  distinct OBJ_TEST  ( EMP_ID , EMP_NAME)
BULK COLLECT INTO LVOB_TEST
from
 ( select distinct emp_id, emp_name from tmp_emp )
© www.soinside.com 2019 - 2024. All rights reserved.