Oracle PL/SQL:ORA-00907:批量收集中出错
是否有一种方法可以使用Oracle PL/SQL:ORA-00907:批量收集中出错,oracle,plsql,plsqldeveloper,bulk-collect,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 ; 您对细节非常了解,但猜测一下,您希望: SELECT distinct OBJ_TEST ( EMP_ID , EMP_NAME) BULK COLLECT INTO LVOB_TEST from ( select di
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 )
您对细节非常了解,但猜测一下,您希望:
SELECT distinct OBJ_TEST ( EMP_ID , EMP_NAME)
BULK COLLECT INTO LVOB_TEST
from
( select distinct emp_id, emp_name from tmp_emp )
有没有一种方法可以使用distinct&alias(as)来实现
批量收集查询如下
SELECT distinct OBJ_TEST ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;
不确定为什么要使用别名,因为在批量收集
时获取别名并使用它是没有意义的。您必须始终使用所定义对象的列名。请参见下文并阅读我的内联评论:
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&alias(as)来实现
批量收集查询如下
SELECT distinct OBJ_TEST ( EMP_ID as E1, EMP_NAME)
BULK COLLECT INTO LVOB_TEST
FROM TMP_EMP ;
不确定为什么要使用别名,因为在批量收集
时获取别名并使用它是没有意义的。您必须始终使用所定义对象的列名。请参见下文并阅读我的内联评论:
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.
OBJ_测试是关于什么的?它是一种对象类型,批量收集语句是流水线函数的一部分<代码>创建或替换类型SBGMCS.OBJ_TEST作为对象(EMP_ID编号(10),EMP_名称VARCHAR2(100))那么什么是E1
;TMP\u EMP
的结构是什么,如何定义LVOb\u测试?一些上下文可能会有帮助……您正在返回一组obj_test
对象,因此如果您真的想命名它(尽管您不必这么做),它将类似于选择不同的obj_test(emp_id,emp_name)作为person
。obj_test是关于什么的?它是一种对象类型,bulk collect语句是流水线函数的一部分<代码>创建或替换类型SBGMCS.OBJ_TEST作为对象(EMP_ID编号(10),EMP_名称VARCHAR2(100))那么什么是E1
;TMP\u EMP
的结构是什么,如何定义LVOb\u测试?一些上下文可能会很有帮助……您正在返回一组obj\u test
对象,因此如果您真的想命名它(尽管您不必这么做),它将类似于选择不同的obj\u test(emp\u id,emp\u name)作为person
。