【问题标题】:Using Bulk collect in PL/SQL into table object type在 PL/SQL 中使用 Bulk collect 到表对象类型中
【发布时间】:2016-02-19 01:00:12
【问题描述】:

谁能告诉我为什么我在编译过程时遇到 PL/SQL 错误:

错误 (11,23):PLS-00403:表达式“USER_DETAILS_LIST”不能用作 SELECT/FETCH 语句的 INTO 目标。

这里是对象和过程:

CREATE OR REPLACE TYPE  USERID IS OBJECT
(
 USERID             VARCHAR2(50)
);

CREATE OR REPLACE TYPE  USERID_LIST AS TABLE OF  USERID;

CREATE OR REPLACE TYPE  USER_DETAILS IS OBJECT
(
 USERID             VARCHAR2(50),
 ORGANIZATION       VARCHAR2(200),
 EMAIL              VARCHAR2(200),
 FIRSTNAME          VARCHAR2(200),
 LASTNAME           VARCHAR2(200),
 FULLNAME           VARCHAR2(200)
);

CREATE OR REPLACE TYPE  USER_DETAILS_LIST AS TABLE OF  USER_DETAILS;

CREATE OR REPLACE PROCEDURE GET_USER_DETAILS_FOR_NOTIF(USERID_LIST IN USERID_LIST,
    USER_DETAILS_LIST IN  USER_DETAILS_LIST) IS

BEGIN
    SELECT  USER_DETAILS(USER_ID,
                         ORGANIZATION,
                         EMAIL,
                         FIRSTNAME,
                         LASTNAME,
                         FULLNAME)
            BULK COLLECT INTO USER_DETAILS_LIST
            FROM    USERS_TBL
            WHERE   USER_ID IN (SELECT USERID
                                  FROM TABLE( USERID_LIST));
END;

【问题讨论】:

  • 不是您的错误的根源...但是让集合类型名称与该类型的局部变量(或参数)的名称匹配似乎很可能导致混淆。
  • 感谢您的关注,我会解决的。

标签: sql oracle stored-procedures plsql


【解决方案1】:

在过程签名中,USER_DETAILS_LIST需要指定为IN OUT而不是IN,如:

CREATE OR REPLACE PROCEDURE GET_USER_DETAILS_FOR_NOTIF(USERID_LIST IN USERID_LIST,
    USER_DETAILS_LIST IN OUT USER_DETAILS_LIST)
    ...

【讨论】:

  • 谢谢哈立德,真棒:-)
  • 嗨 Khalid,你能看看上面 SQL 中的子查询吗,它选择了 userid_list 集合中的所有用户 ID。问题是这个过程没有返回我作为输入传递的所有用户标识的集合。这让我相信“SELECT USERID FROM TABLE(USERID_LIST)”子查询不会返回所有用户。
猜你喜欢
  • 2013-05-12
  • 2018-01-27
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多