填充临时表的有效方法

时间:2012-04-01 18:04:23

标签: oracle plsql oracle11gr2

Default_accounts
========================
p_type        varchar2
t_type        varchar2
A         varchar2
B         varchar2
C             varchar2
D             varchar2
=========================

p_typet_type是表格的主键

p_type  t_type  A   B  C  D
============================
apple    sell   Y   N  N  Y
banana   buy    N   N  N  Y
orange   sell   Y   N  N  N
mango    buy    Y   Y  N  Y
papaya   buy    Y   N  N  Y
apple    buy    Y   N  N  Y
banana   sell   Y   Y  Y  Y
============================


 Accounts_Exceptions
=============================
acc_excep_id          number    --sequence (Primary key)
p_type                varchar2
t_type                varchar2
excep_attribute       varchar2  --contains column of default_accounts like A,B,C,D
priority              number
excep_base_sql        varchar2
excep_value           varchar2
===============================

Unique constraint:p_type,t_type,excep_attribute和priority foreign_key:来自Default_accounts

的p_type和t_type
  acc_excep_id   p_type    t_type  excep_attribute priority  excep_base_sql   excep_value
---------------------------------------------------------------------------------------------
     1           apple    buy       A              1         --some--         XYZ
     2           apple    buy       A              2         --some--         PQR
     3           banana   sell      B              1         --some--         GHT
     4           banana   sell      B              2         --some--         GFF
     5           orange   sell      C              1         --some--         DSA    
---------------------------------------------------------------------------------------------

excep_base_sql:它包含一个像select 1 from alloc where alloc_id =:alloc;这样的SQL查询 - 一个示例查询,但它始终包含bind vairable:alloc

  1. 现在我的要求是我有一个包含alloc_id ,p_type,t_type

  2. 记录的游标
  3. 我把记录放在一个临时表中,结构如下:

     alloc_id p_type  t_type  A   B    C   D
    ---------------------------------------------
     11       apple   buy    
     22       apple   sell
     33       mango   buy
     12       mango   buy
     13       mango   buy
     24       banana  buy
     54       orange  sell
    

    3.但是如您所见,我需要批量填充A,B,C和D值,临时表可以包含millions of record左右。

    4.为了填充值,我需要首先检查account_exceptions表以查找任何异常。 例如:我从临时表中获取11 apple buy并查看异常表,在异常表中查找p_typeapple的记录和t t_type buy按优先顺序按升序排序。

    5.因此,获取acc_excep_id1,2的记录,我获取第一条记录并运行excep_base_sql alloc_id 11,如果返回行,那么我将更新 临时表中excep_attribute A XYZ,然后跳过优先级为2的第二条记录,因为优先级为1的记录满足。

    6.如果execptions表中没有apple buy的条目,那么我需要使用default_accounts表填充临时表,因此该值为Y

    7.因此,如果没有异常满足,则从default_accounts中选择默认值。

    8.总之,我需要在表A B C D中填充temp的值。

    9.我需要一种方法来有效地将数据填充到值A B C D的临时表中。

  4. 任何人都可以帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

我要推荐两件事。

1)在执行批量插入时,作为select的select或create table的插入始终是最有效的。

2)它“听起来”就像你试图将行转换为列。我会推荐Oracle的支点功能。此处描述了数据透视功能:Oracle Base Pivot