Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在update语句的where子句中使用数组类型_Oracle_Plsql_Oracle9i - Fatal编程技术网

Oracle 如何在update语句的where子句中使用数组类型

Oracle 如何在update语句的where子句中使用数组类型,oracle,plsql,oracle9i,Oracle,Plsql,Oracle9i,我想要一个过程获取禁用权限列表,并更新其在表中的记录。为了实现此场景,我使用以下代码将数组定义为数据库对象: CREATE OR REPLACE TYPE T_DISABLE_LIST IS TABLE OF NUMBER(32) 然后我在过程签名中定义了一个输入参数,并得到了传递的值 PROCEDURE PRC_ROLE_PRIVILAGE_MANAGEMENT(P_REQ_USER_ID IN VARCHAR2,

我想要一个过程获取禁用权限列表,并更新其在表中的记录。为了实现此场景,我使用以下代码将数组定义为数据库对象:

CREATE OR REPLACE TYPE T_DISABLE_LIST IS TABLE OF NUMBER(32)
然后我在过程签名中定义了一个输入参数,并得到了传递的值

PROCEDURE PRC_ROLE_PRIVILAGE_MANAGEMENT(P_REQ_USER_ID    IN VARCHAR2,
                                        P_DISABLE_LIST   IN T_DISABLE_LIST,
                                        P_RES_DESC       OUT VARCHAR2)
BEGIN
    UPDATE T_ PRIVILAGE p
       SET P.ENABLE_STATUS = 0, P.GRANT_USERID = P_REQ_USER_ID
    WHERE P.ID IN (SELECT * FROM TABLE(P_DISABLE_LIST));

    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        RES_DESC := SUBSTR(SQLERRM,1, 400);
END;
此过程将成功编译。但是当我测试它时,我得到了这个错误:

ORA-22905:无法访问非嵌套表项中的行

有人能帮我吗?然后说为什么这个代码不能正常工作

最后,我该如何解决这个问题


我的orcale版本是9.2

这假设您使用的是Oracle 10g或更高版本(并且是在OP澄清他们使用的版本之前编写的)

使用操作员的
成员:

UPDATE T_PRIVILAGE
SET    ENABLE_STATUS = 0,
       GRANT_USERID  = P_REQ_USER_ID
WHERE  ID MEMBER OF P_DISABLE_LIST;
您还可以使用
列\u值
伪列:

UPDATE T_PRIVILAGE
SET    ENABLE_STATUS = 0,
       GRANT_USERID  = P_REQ_USER_ID
WHERE  ID IN ( SELECT COLUMN_VALUE FROM TABLE( P_DISABLE_LIST ) );
为什么此代码不能正常工作

正在从表中选择行。但是,该表是由表集合表达式生成的,并且没有底层数据库表可引用一行,因此Oracle生成一个
ORA-22905
异常(如果集合存储在嵌套表中,则会有一个底层表;这就是异常中特别提到这种情况的原因)

更新:PL/SQL解决方案:

FOR i IN 1 .. P_DISABLE_LIST.COUNT LOOP
  UPDATE T_PRIVILAGE
  SET    ENABLE_STATUS = 0,
         GRANT_USERID  = P_REQ_USER_ID
  WHERE  ID = P_DISABLE_LIST(i);
END LOOP;

假设您使用的是Oracle 10g或更高版本(并且是在OP澄清他们使用的版本之前编写的)

使用操作员的
成员:

UPDATE T_PRIVILAGE
SET    ENABLE_STATUS = 0,
       GRANT_USERID  = P_REQ_USER_ID
WHERE  ID MEMBER OF P_DISABLE_LIST;
您还可以使用
列\u值
伪列:

UPDATE T_PRIVILAGE
SET    ENABLE_STATUS = 0,
       GRANT_USERID  = P_REQ_USER_ID
WHERE  ID IN ( SELECT COLUMN_VALUE FROM TABLE( P_DISABLE_LIST ) );
为什么此代码不能正常工作

正在从表中选择行。但是,该表是由表集合表达式生成的,并且没有底层数据库表可引用一行,因此Oracle生成一个
ORA-22905
异常(如果集合存储在嵌套表中,则会有一个底层表;这就是异常中特别提到这种情况的原因)

更新:PL/SQL解决方案:

FOR i IN 1 .. P_DISABLE_LIST.COUNT LOOP
  UPDATE T_PRIVILAGE
  SET    ENABLE_STATUS = 0,
         GRANT_USERID  = P_REQ_USER_ID
  WHERE  ID = P_DISABLE_LIST(i);
END LOOP;

您的自定义类型是否在数据库级别声明?如果在PL/SQL中声明,则会收到此错误,因为数据库引擎不知道类型。检查亲爱的@ThomasG,是的,我在数据库级别定义了它(作为数据库对象)您的自定义类型是在数据库级别声明的吗?如果在PL/SQL中声明,则会收到此错误,因为数据库引擎不知道类型。检查亲爱的@ThomasG,是的,我在数据库级别(作为数据库对象)定义了它。您的答案无效。对于第一个解决方案,代码没有编译,我得到了这个错误
“ORA-00920:无效的关系运算符”
。在第二个解决方案中,我遇到了一个错误,
“ORA-22905:无法从非嵌套表项访问行”
@M.i.T这是一个非常重要的问题,如果没有它,我们假设您使用的是过去十年发布的版本,而不是上个世纪发布的版本。@M.i.T我添加了一个PL/SQL解决方案,可以工作,但我没有Oracle 9i实例来测试它。亲爱的@MT0,您是对的。我忘了。我道歉。。。这个应用程序非常旧,我必须支持它:'(您的答案不起作用。在第一个解决方案中,代码没有编译,我得到了这个错误
“ORA-00920:无效的关系运算符”
。在第二个解决方案中,我得到了这个错误
“ORA-22905:无法从非嵌套表项访问行”
@M.i.T这是一个非常重要的问题,你需要把它放在你的问题中,因为如果没有它,我们会假设你使用的是过去十年发布的版本,而不是几乎上个世纪发布的版本。@M.i.T我添加了一个PL/SQL解决方案,可以工作,但我没有一个Oracle 9i实例来测试它。亲爱的@MT0,你说得对。我忘了。很抱歉……这个应用程序很旧,我必须支持它:'(