-1

COUNTRY|JOB_CD |AGE のようなパイプ区切り文字で区切られた単一または複数の属性を含む「スコープ」と呼ばれる 1 つのフィールドを持つテーブルがあります。これらの属性は、テーブルのエイリアス名とのマッピングを持つ別のテーブルで個別に定義され、別のテーブルは、前のテーブルのエイリアスを使用して、これらの属性が個別に属する実際のテーブル名を提供します。

条件に属するすべての個人 ID を取得するスコープ値を読み取った後、クエリを作成する必要があります表、これを効率的に達成する方法..助けてください。

PERSONID    SCOPE                  COMP_VALUE
------------------------------------------------------------------------
1234        COUNTRY|JOB_CD |AGE    USA|23|30


ELEMENT CD  ALIAS
-----------------------------
COUNTRY EA  
JOB_CD  EJ
AGE     EATTR


ALIAS   TABLE_NM
-----------------------------------
EA      EMP_ADDRESS
EJ      EMP_JOB
EATTR   EMP_ATTRIB

上記の表にはさらに多くの列がありますが、必要なものをいくつか投稿しました

以下のすべてのテーブルには、共通のフィールド person_id があります。

EMP_ADDRESS Table have below column
-------------------------
PERSON_ID
COUNTRY

EMP_JOB Table have below column
-------------------------
PERSON_ID
JOB_CD


EMP_ATTRIB Table have below column
-------------------------
PERSON_ID
AGE
4

1 に答える 1

0

このシャンキー CSV テーブルからの出力を他のテーブルに結合する方法をまだ明確にしていません。したがって、このソリューションは問題のその部分を無視します。追加のガイダンスが必要な場合は、要件に関する詳細情報を提供する必要があります。

Hers は 1 つのソリューションです。パイプライン化された関数を使用しますが、これは必ずしも最もパフォーマンスの高いオプションではありませんが、私が言ったように、あなたの状況は非常に混乱しているため、「高速に動作する」よりも「動作する」必要があります。

パイプライン関数は、ネストされたテーブルを返します。

create or replace type bp_record as object
( element varchar2(30)
  , table_name varchar2(30)
  , value varchar2(30) );
/

create or replace type bp_recs as table of bp_record;
/

パイプライン関数自体:

create or replace function bp_cannon 
  ( p_id in your_table.personid%type)
  return bp_recs pipelined
is
    return_value bp_record := new bp_record (null,null,null);
    lrec your_table%rowtype;
    s_offset pls_integer := 1;
    s_nxt pls_integer; 
    c_offset pls_integer := 1;
    c_nxt pls_integer; 
begin
    select personid, concat(scope, '|'), concat(comp_value, '|') 
    into lrec 
    from your_table
    where personid = p_id;

    loop
        s_nxt := instr(lrec.scope, '|', s_offset);
        if s_nxt = 0 then exit; end if;
        return_value.element := trim(substr(lrec.scope, s_offset, s_nxt-s_offset));

        select tl.table_nm
        into return_value.table_name
        from element_lookup el
            join table_lookup tl 
            on ( tl.alias = el.alias)
        where el.element = return_value.element;

        c_nxt := instr(lrec.comp_value, '|', c_offset);
        return_value.value := trim(substr(lrec.comp_value, c_offset, c_nxt-c_offset));

        pipe row (return_value);

        s_offset := s_nxt + 1;
        c_offset := c_nxt + 1;
    end loop;

    return;
end bp_cannon;
/

実際に:

SQL> select * from table (bp_cannon(1234))
  2  /

ELEMENT                        TABLE_NAME                     VALUE
------------------------------ ------------------------------ ------------------------------
COUNTRY                        EMP_ADDRESS                    USA
JOB_CD                         EMP_JOB                        23
AGE                            EMP_ATTRIB                     30

SQL>
于 2013-07-14T21:53:40.140 に答える