2015-04-23 107 views
0

我在甲骨文下面的代碼窗體細節塊值分配給數組從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

您不需要集合類型來存儲標量值。在本地聲明另一個變量並分配值,它可以在會話範圍內使用,因爲它是局部變量。 –

回答

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; 
... 
+0

我試過這個,但是它內部while循環檢查是否存在條件,它會進入無限循環。 – user75ponic

+2

@Polppan這是你的循環中的一個問題,而不是在這個通用結構中 –

+0

我在我的問題中包含了我的代碼片段,編輯2 – user75ponic

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> 
+0

這是一個風險,因爲你不知道記錄的數量,你可以用盡可變的大小 –