2017-02-17 27 views
0

我怎麼能做到這一點:PL/SQL:法的會員「其中」

從三個不同的列中選擇值到嵌套表或者一些其他類型的集合...

DECLARE 
TYPE blockers_set IS TABLE OF (
employee_ID NUMBER(8), 
BLOCKING_GROUP NUMBER(4), 
BLOCKING_TYPE NUMBER2(2)); 

select employee_ID, BLOCKING_GROUP, BLOCKING_TYPE 
bulk collect into blockers 
from blockers; 

。 ..並參考列:

if employee_ID not member of blockers where blocking_group = 1 
and blocking_type = 2 
then <<business logic>> 

blockers-collection中可以有一個以上的employee_ID行。

這是必須用pl/sql來完成的。

回答

0

如下你可以這樣做:

CREATE TABLE blockers(
         employee_id NUMBER(8), 
         blocking_group NUMBER(4), 
         blocking_type number(2)); 


=============================== 

select * from blockers; 

=============================== 

Create or replace type OBJ_BLOCKERS as OBJECT(
               employee_id NUMBER(8), 
               blocking_group NUMBER(4), 
               blocking_type number(2) 
              ); 

================================================= 

Create or replace type varble is table of OBJ_BLOCKERS; 

=================================================== 

DECLARE 
    --Creating one element for comparision. In your case you need to populate your employee_id to be compared here.  
    tmp OBJ_BLOCKERS:=OBJ_BLOCKERS(263427,1,2); 
    var varble; 
    myid INT; 

begin 

    --This how you Select values from three different columns into nested table(Object) 
    Select OBJ_BLOCKERS(employee_id, 
         blocking_group, 
         blocking_type) 
    Bulk Collect into var 
    from blockers; 

    -- Displaying Employee_Id from the collection 
    For i in 1..var.count 
    loop 
    dbms_output.put_line(var(i).employee_id); 
    end loop; 

    -- 

    SELECT 1 
     INTO myid 
     FROM TABLE(var) q 
     where OBJ_BLOCKERS(q.employee_id,q.blocking_group,q.blocking_type) = tmp --Here you are comparing the employee_id which should be a member of collection 
     AND q.blocking_group = 1; 

    IF (myid = 1) THEN 
     dbms_output.put_line('OK, exists.'); 
    END IF;  

Exception 
When No_DATa_found then 
     dbms_output.put_line('No Data Found'); 

End;              

執行:

SQL>/
263427 
534366 
454562 
OK, exists. 

PL/SQL procedure successfully completed. 

需要注意的是:

如果EMPLOYEE_ID不阻滯劑成員,其中blocking_group = 1和 blocking_type = 2

這不可能使用Member Funtion。你需要聲明一個MAP方法,如果對象有很多屬性(就像你的情況一樣),這個方法相當笨拙,會變得非常煩人。

+0

謝謝你的答案。這似乎可行。我會嘗試的。 是否有可能以某種方式使用一個查詢批量收集到不同類型的案例? 選擇的情況下 當EMPLOYEE_ID = 1,則批量收集到阻斷器 當EMPLOYEE_ID = 2,那麼批量收集到blocker2 結束 我無法得到它的權利。 @XING –

+0

@PLPertti ..你問這個給我還是告訴我?我無法理解 – XING

+0

我想問的是:這可能在一個查詢中完成: 選擇阻止程序批量收集阻塞程序_1 阻止程序 其中blocker_type = 1; 選擇阻滯劑批量收集阻滯劑 阻斷劑_0 其中blocker_type = 2; @XING –