2017-09-20 13 views
0

member ofをOracleで使用しようとしています。 テーブルタイプが数値か他のデータタイプの場合に使用できます。テーブルは以下のコードのように、レコードに基づいてされたとき、私はmember ofを使用するにはどうすればよい'Member of' in Oracle

declare 
    type t is table of number; 
    lt t; 
begin 
    select channel_key 
    bulk collect into lt 
    from dim_channels; 

    if 22 member of lt then 
     dbms_output.put_line('ss'); 
    end if; 
end; 

:以下は、このためのコードです。

declare 
    type rt is record 
    (
     channel_key number(10), 
     channel_code varchar2(100) 
    ); 

    type t is table of rt; 
    lt t; 
    lrt rt; 
begin 
    select channel_key, channel_code 
    bulk collect into lt 
    from dim_channels; 
end; 

答えて

3

これは、プレーンなローカルPL/SQLレコード・タイプでは機能しません。それ以上の属性を含めるには、あなたがMAPまたはORDER機能を持つオブジェクト型が必要になります。

create or replace type demo_ot as object 
(channel_key integer 
, channel_code varchar2(30) 
, map member function demo_map return varchar2) 
/

create or replace type body demo_ot as 
    map member function demo_map return varchar2 
    is 
    begin 
     return self.channel_key || '<#>' || self.channel_code; 
    end demo_map; 
end; 
/

declare 
    type demo_t is table of demo_ot; -- You would normally create this globally in SQL 
    my_set  demo_t; 
    my_object demo_ot; 
begin 
    select demo_ot(ckey, ccode) 
    bulk collect into my_set 
    from (select 1 as ckey, 'One' as ccode from dual 
      union all 
      select 2 as ckey, 'Two' as ccode from dual); 

    my_object := demo_ot(2, 'Two'); 

    if my_object member of my_set then 
     dbms_output.put_line('Member found'); 
    else 
     dbms_output.put_line('Member not found'); 
    end if; 
end; 
/
0

が、私はそれをそれは問題なくコンパイル

create or replace PROCEDURE P_MEMBER_OF_TEST(p_fname IN VARCHAR2, 
     p_lname in varchar2) 
       AS 
      type type_rec is record 
       (
      first_name employees.first_name%type, 
       last_name employees.last_name%type 
      ); 
      TYPE T_TAB_TYPE IS TABLE OF type_rec; 
      T_TAB T_TAB_TYPE; 
      t_rec type_rec; 
      i int; 
     BEGIN 
      t_rec.first_name := p_fname; 
      t_rec.last_name := p_lname; 
      SELECT FIRST_NAME,last_name bulk collect INTO T_TAB FROM 
      EMPLOYEES; 

      dbms_output.put_line(t_rec.first_name || ',' || t_rec.last_name); 

      IF t_rec MEMBER OF T_TAB THEN 
      DBMS_OUTPUT.PUT_LINE ('YES'); 
      ELSE 
      DBMS_OUTPUT.PUT_LINE('NO'); 
      END IF; 

     END; 

をテストするためのコードの下に作成されたしかし、私は私が手にそれを実行するときエラーが私の接続がリセットされたとき、私はif-else-end ifブロックをコメントします。それは実行されます。 @william Robertson

+0

'type type_rec is record' - この操作では間違った型ですが、何らかの形でコンパイラがこれを逃したり、コンパイルに失敗しないように選択したり、実行時にクラッシュしたりします。あなたが 'set session set plsql_warnings = 'enable:all''を実行すると、' PLW-05022:引数' T_REC 'が(少なくとも12.1.0.2.0では)比較できないというコンパイラ警告が出ます。 –