值分配给数组从PLSQL块

问题描述:

我在甲骨文下面的代码窗体细节块值分配给数组从PLSQL块

BEGIN 
v_product_no := :detail_block.product_no; 
Go_block('detail_block'); 
first_record; 
--some if condition 
WHILE :SYSTEM.last_record != 'TRUE' LOOP   
next_record;  
if(:detail_block.product_no = v_product_no) then 
-- other condtions 

end if; 

END LOOP; 

我想v_product_no存储到某种集合对象,这样我可以用:detail_block.product_no值进行比较。

我该怎么做?

编辑1

product_no将具有值如K1BATTERYK2BATTERYZCATBATEERY等 所以如果K1BATTERY是相同:detail_block.product_no然后用下一个条件进行

编辑2

Go_block('detail_block'); 
v_product_no := :detail_block.product_no; 
v_products(v_product_no) := 1; 

first_record; 

WHILE :SYSTEM.last_record != 'TRUE' LOOP    

    if(v_products.exists(v_product_no)) then 
     alert('duplicate'); 
      end if;  
    END LOOP; 

END if; 

编辑3

Go_block('detail_block'); 
v_product_no := :detail_block.product_no; 
v_products(v_product_no) := 1; 

    first_record; 

    -- condition 


    WHILE :SYSTEM.last_record = 'FALSE' LOOP  
     next_record;   
     v_product_no := :detail_block.product_no; 
     if(v_products.exists(v_product_no)) then 
      alert('duplicate'); 
      else 
     v_products(v_product_no) := 1; 

      end if; 

     END LOOP; 

    END if; 
+0

你真的需要一个集合对象?您可以创建一个包规格,并让它存储该值,如果它是标量值的话。另外为什么不把它存储到本地块变量? – Sathya

+0

@Sathya我的意图是,如果'product_no'重复,那么我想有另一个if条件在同一个细节块中进行评估。将'v_product_no'存储在'varchar2'中并不能帮助比较多记录块中的值。谢谢 – user75ponic

+0

您不需要集合类型来存储标量值。在本地声明另一个变量并分配值,它可以在会话范围内使用,因为它是局部变量。 –

使用PL/SQL关联数组来存储已经处理值。

declare 
    type t_processed is table of number(1) index by varchar2(100); 
    v_product_no varchar2(100); --hold the current value 
    v_products t_processed;  --hold all processed values as keys 
begin 
    v_product_no := :detail_block.product_no; 
    v_products(v_product_no) := 1; --create entry (v_product_no, 1) 
    ... 
    --later in while 
    v_product_no := :detail_block.product_no; 
    if(v_products.exists(v_product_no)) then --entry exists 
    -- other conditions 
    else 
     v_products(v_product_no) := 1; --create entry (v_product_no, 1) 
    end if; 
... 
+0

我试过这个,但是它内部while循环检查是否存在条件,它会进入无限循环。 – user75ponic

+2

@Polppan这是你的循环中的一个问题,而不是在这个通用结构中 –

+0

我在我的问题中包含了我的代码片段,编辑2 – user75ponic

我认为你是在v_product_no变量有Varying IN list of values

你可以做到这一点在下面的方式,

测试#1

SQL> var product_no VARCHAR2(1000) 
SQL> exec :product_no := 'K1BATTERY' 

PL/SQL procedure successfully completed. 

SQL> 
SQL> SET SERVEROUTPUT ON 
SQL> 
SQL> DECLARE 
    2 v_product_no VARCHAR2(1000); 
    3 BEGIN 
    4 v_product_no := 'K1BATTERY, K2BATTERY, ZCATBATEERY'; 
    5 IF :product_no IN (trim(regexp_substr(v_product_no, '[^,]+'))) THEN 
    6  DBMS_OUTPUT.PUT_LINE('FOUND A MATCH'); 
    7 ELSE 
    8  DBMS_OUTPUT.PUT_LINE('NO MATCH FOUND'); 
    9 END IF; 
10 END; 
11/
FOUND A MATCH 

PL/SQL procedure successfully completed. 

测试#2

SQL> var product_no VARCHAR2(1000) 
SQL> exec :product_no := 'ABCD' 

PL/SQL procedure successfully completed. 

SQL> 
SQL> SET SERVEROUTPUT ON 
SQL> 
SQL> DECLARE 
    2 v_product_no VARCHAR2(1000); 
    3 BEGIN 
    4 v_product_no := 'K1BATTERY, K2BATTERY, ZCATBATEERY'; 
    5 IF :product_no IN (trim(regexp_substr(v_product_no, '[^,]+'))) THEN 
    6  DBMS_OUTPUT.PUT_LINE('FOUND A MATCH'); 
    7 ELSE 
    8  DBMS_OUTPUT.PUT_LINE('NO MATCH FOUND'); 
    9 END IF; 
10 END; 
11/
NO MATCH FOUND 

PL/SQL procedure successfully completed. 

SQL> 
+0

这是一个风险,因为你不知道记录的数量,你可以用尽可变的大小 –