-1

我有一张表,其中我们有一个名为“范围”的字段包含单个或多个属性,这些属性由管道分隔符分隔,例如 COUNTRY|JOB_CD |AGE。这些属性在另一个表中单独定义,该表具有与表别名名称的映射,另一个表为您提供真实表名,这些属性使用上表中的别名单独属于这些表名。

我必须在读取范围值后创建一个查询,该值检索属于条件的所有人员 ID,这意味着“获取所有居住在美国且 JOB_CD 为 23 且年龄为 30 的用户”,因为我们没有一个人的所有属性/属性表,如何有效地实现这一目标..请帮助。

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 表的输出连接到您拥有的任何其他表。所以这个解决方案忽略了问题的那一部分。如果您需要额外的指导,您需要提供有关您的要求的更多信息。

她的解决方案是一种。它使用流水线功能,这不一定是性能最高的选项,但就像我说的那样,您的情况如此混乱,您必须将“它工作”而不是“它工作得很快”。

流水线函数返回一个嵌套表:

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