值分配给数组从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
将具有值如K1BATTERY
,K2BATTERY
,ZCATBATEERY
等 所以如果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;
使用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;
...
我试过这个,但是它内部while循环检查是否存在条件,它会进入无限循环。 – user75ponic
@Polppan这是你的循环中的一个问题,而不是在这个通用结构中 –
我在我的问题中包含了我的代码片段,编辑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>
这是一个风险,因为你不知道记录的数量,你可以用尽可变的大小 –
你真的需要一个集合对象?您可以创建一个包规格,并让它存储该值,如果它是标量值的话。另外为什么不把它存储到本地块变量? – Sathya
@Sathya我的意图是,如果'product_no'重复,那么我想有另一个if条件在同一个细节块中进行评估。将'v_product_no'存储在'varchar2'中并不能帮助比较多记录块中的值。谢谢 – user75ponic
您不需要集合类型来存储标量值。在本地声明另一个变量并分配值,它可以在会话范围内使用,因为它是局部变量。 –