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@不,这是不可能的。您不能从集合中选择。但是如果“阻止程序”是表,而不是集合@邢