我有一套产品,我想要标记到某个值,所以我做了这个:
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;
除了这不起作用,因为显然我不能以这种方式混合查询和数组。
我对如何使这项工作有所了解?
答案 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);
如果您不想创建自己的对象类型,可以使用预先存在的varchar2
或number
类型,例如sys.odcivarchar2list
,如下所述:
Anonymous TABLE or VARRAY type in Oracle