【问题标题】:Mixing arrays and queries混合数组和查询
【发布时间】:2015-02-12 17:53:31
【问题描述】:

我有一组产品要标记为某个值,所以我这样做了:

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;

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

知道我该如何完成这项工作吗?

【问题讨论】:

    标签: plsql


    【解决方案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

    【讨论】:

    • 当我今天尝试这个解决方案时,我收到一条错误消息,说它需要一个“不透明对象”而不是表?
    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多