2017-02-17 13 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>> 

В блокеров может быть более одной строки для одного сотрудника_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, то набухают собрать в blocker1 при EMPLOYEE_ID = 2, то набухают собрать в blocker2 конце я не мог получить это право. @XING –

+0

@PLPertti .. вы спрашиваете об этом мне или говорите? Я не мог понять – XING

+0

То, что я пытаюсь спросить: возможно ли это в одном запросе: select blocker bulk collect into blocker_1 от блокаторов где blocker_type = 1; select blocker bulk collect into blocker_2 от блокаторов где blocker_type = 2; @XING –