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>>
Может быть больше чем одна строка для одного employee_ID в коллекции блокаторов.
Это должно быть сделано с PL / SQL.
1 ответ
Вы можете сделать это следующим образом:
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
метод, который довольно неуклюжий и будет довольно раздражающим, если у объекта много атрибутов (как в вашем случае).