混合数组和查询

时间:2015-02-12 17:53:32

标签: plsql

我有一套产品,我想要标记到某个值,所以我做了这个:

declare
   type array_produit_auto is varray(3) of varchar(50);
   array array_produit_auto := array_produit_auto('code_product1', 'code_product2', 'code_product3');

begin
   for i in 1..array.count loop
        update F_PRODUITASS pas
        set PAS_NONGES_IDA = 0
        WHERE PAS.PAS_CODE_PRODUIT = array(i;
   end loop;
end;
commit;
但是,这些产品的清单太长了。相反,我想这样做:

declare
   type array_produit_auto is varray(3) of varchar(50);
   array array_produit_auto := array_produit_auto('code_product4', 'code_product5', 'code_product6');

begin
    update F_PRODUITASS pas
    set PAS_NONGES_IDA = 1
    WHERE PAS.PAS_CODE_PRODUIT NOT IN array;
end;
commit;

除了这不起作用,因为显然我不能以这种方式混合查询和数组。

我对如何使这项工作有所了解?

1 个答案:

答案 0 :(得分:1)

如果您使用嵌套表,则可以从嵌套表中查询,如下所示:

DECLARE

    v_exclude_list t_array_produit_auto :=
        t_array_produit_auto('code_product4', 'code_product5', 'code_product6');

BEGIN

    UPDATE F_PRODUITASS pas
      SET PAS_NONGES_IDA = 1
      WHERE PAS.PAS_CODE_PRODUIT NOT IN ( SELECT *
                                            FROM TABLE(v_exclude_list) )
    ;
END;
/

另外,你的意思是varchar2,对吧?

关于不透明错误的更新:类型声明需要是一个对象类型(使用CREATE OR REPLACE TYPE语法创建,而不是像下面的DDL中那样使用本地plsql类型。

CREATE TABLE F_PRODUITASS(PAS_NONGES_IDA number, PAS_CODE_PRODUIT VARCHAR2(50));
INSERT INTO F_PRODUITASS VALUES(3, 'code_product3');
INSERT INTO F_PRODUITASS VALUES(4, 'code_product4');

CREATE OR REPLACE TYPE t_array_produit_auto IS TABLE OF VARCHAR2(50);

如果您不想创建自己的对象类型,可以使用预先存在的varchar2number类型,例如sys.odcivarchar2list,如下所述: Anonymous TABLE or VARRAY type in Oracle