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

时间:2018-03-02 21:51:15

标签: oracle plsql plsqldeveloper bulk-collect

我们是否有办法使用distinct&别名(as),用于实现批量收集查询,如下所示。

SELECT  distinct OBJ_TEST  ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;

2 个答案:

答案 0 :(得分:2)

  

我们是否有办法使用不同的& amp;别名(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.

答案 1 :(得分:0)

你对细节很了解,但猜测一下,你想要:

SELECT  distinct OBJ_TEST  ( EMP_ID , EMP_NAME)
BULK COLLECT INTO LVOB_TEST
from
 ( select distinct emp_id, emp_name from tmp_emp )