2017-02-17 1 views
0

Wie könnte ich dies tun:PL/SQL: Mitglied von Verfahren mit „where“

Wählen Sie Werte aus drei verschiedenen Spalten in verschachtelter Tabelle oder eine andere Art von Sammlung ...

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; 

. ..und beziehen sich auf die Spalten:

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

In blockers-collection kann es mehr als eine Zeile für eine employee_ID geben.

Dies ist mit pl/sql zu tun.

Antwort

0

Sie können es wie folgt:

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;              

Ausführung:

SQL>/
263427 
534366 
454562 
OK, exists. 

PL/SQL procedure successfully completed. 

Beachten Sie, dass:

wenn employee_id nicht Mitglied von Blockern wo blocking_group = 1 und blocking_type = 2

Dies ist mit einem Member Funtion nicht möglich. Sie müssen eine Methode deklarieren, die ziemlich klobig ist und eher ärgerlich würde, wenn das Objekt viele Attribute hat (genau wie in Ihrem Fall).

+0

Vielen Dank für die Antwort. Das scheint praktikabel. Ich werde es versuchen. Wäre es möglich, irgendwie eine Abfrage zu verwenden, um in verschiedene Typen zu sammeln ... mit Groß-/Kleinschreibung? Wählen Fall, wenn employee_id = 1, dann sammeln bulk in blocker1 wenn employee_id = 2 dann sammeln bulk in blocker2 Ende Ich kann es nicht richtig machen. @XING –

+0

@PLPertti .. Sie fragen dies zu mir oder sagen Sie mir? Ich konnte nicht verstehen – XING

+0

Was ich versuche zu fragen: ist dies in einer Abfrage möglich: Blocker Bulk sammeln in Blocker_1 von Blockern wo Blocker_type = 1; Blocker Bulk Collect in Blocker_2 von Blockern wählen, wo blocker_type = 2; @XING –