PL/SQL: ORA-00907: 批量收集错误
PL/SQL: ORA-00907 : Error in Bulk collect
有没有办法使用 distinct
& 别名 (as
) 来实现如下批量收集查询。
SELECT distinct OBJ_TEST ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;
你不太注重细节,但我猜你想要:
SELECT distinct OBJ_TEST ( EMP_ID , EMP_NAME)
BULK COLLECT INTO LVOB_TEST
from
( select distinct emp_id, emp_name from tmp_emp )
Is there a way that we use the distinct & alias (as), to achieve the
bulk collect query as below.
不确定为什么要使用别名,因为在 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.
有没有办法使用 distinct
& 别名 (as
) 来实现如下批量收集查询。
SELECT distinct OBJ_TEST ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;
你不太注重细节,但我猜你想要:
SELECT distinct OBJ_TEST ( EMP_ID , EMP_NAME)
BULK COLLECT INTO LVOB_TEST
from
( select distinct emp_id, emp_name from tmp_emp )
Is there a way that we use the distinct & alias (as), to achieve the bulk collect query as below.
不确定为什么要使用别名,因为在 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.