【问题标题】:PL/SQL: Member of method with "where"PL/SQL:带有“where”的方法的成员
【发布时间】:2017-02-17 20:39:17
【问题描述】:

我该怎么做:

从三个不同的列中选择值到嵌套表或其他类型的集合中...

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>>

blockers-collection 中的一个employee_ID 可以有不止一行。

这必须用 pl/sql 来完成。

【问题讨论】:

    标签: plsql memberof


    【解决方案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 不是blockers 的成员,其中blocking_group = 1 并且 阻塞类型 = 2

    使用Member Funtion 是不可能的。您需要声明一个MAP 方法,该方法相当笨拙,并且如果对象具有很多属性(就像您的情况一样)会变得相当烦人。

    【讨论】:

    • 感谢您的回答。这似乎可行。我会试试的。是否有可能以某种方式使用一个查询来批量收集到不同的类型......带案例?当employee_ID = 1 时选择案例,然后当employee_ID = 2 时将批量收集到blocker1 然后批量收集到blocker2 结束时我无法正确处理。 @XING
    • @PLPertti.. 你是在问我还是告诉我?我听不懂
    • 我想问的是:这可以在一个查询中完成吗:select blocker bulk collect into blocker_1 from blocker where blocker_type =1; select blocker bulk collect into blocker_2 from blocker where blocker_type =2; @XING
    • 不,这是不可能的。您无法从集合中进行选择。
    • 但是如果“blockers”是一个表,而不是集合? @XING
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多