Plsql PL/SQL:带“的方法的成员”;其中;
我怎样才能做到这一点: 从三个不同的列中选择值到嵌套表或其他类型的集合中Plsql PL/SQL:带“的方法的成员”;其中;,plsql,memberof,Plsql,Memberof,我怎样才能做到这一点: 从三个不同的列中选择值到嵌套表或其他类型的集合中 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; …
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不是阻止者的成员,其中阻止组=1
和阻塞类型=2
然后
blockers集合中一个员工ID可以有多行
这必须通过pl/sql完成 您可以按如下方式执行:
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.
请注意:
如果员工ID不是阻止者的成员,其中阻止组=1和
阻塞类型=2
使用
成员函数
,这是不可能的。您需要声明一个MAP
方法,如果对象有很多属性(就像您的情况一样),该方法相当笨拙,并且会变得相当烦人。谢谢您的回答。这似乎可行。我试试看。是否可能以某种方式使用一个查询批量收集到不同的类型。。。凯斯?当员工ID=1时选择案例,然后批量收集到blocker1当员工ID=2时,然后批量收集到blocker2 end我无法正确获取它@XING@PLPertti.. 你是问我还是告诉我?我不明白我想问什么:这是否可以在一个查询中完成:从blocker_type=1的blocker中选择blocker bulk collect to blocker_1;从blocker_type=2的blocker中选择blocker bulk collect to blocker_2@不,这是不可能的。您不能从集合中选择。但是如果“阻止程序”是表,而不是集合@邢