从plsql块为数组赋值

时间:2015-04-23 08:35:54

标签: oracle plsql oracleforms

我在Oracle Forms详细信息块中有以下代码

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;

2 个答案:

答案 0 :(得分:3)

使用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;
...

答案 1 :(得分:1)

我认为你在 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>