从 plsql 块中为数组赋值

Assign value to array from plsql block

我在 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;

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

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