2016-11-28 84 views
-1

我如何将数据插入多个表中的所有表都有一个共同的前缀为他们的表名表的表将数据插入多个表

这是生成的表和错误表的结构包(DBMS_ERRLOG.CREATE_ERROR_LOG):

Name        Type 
---------------------------------------------------------------------------- 
ACCOUNT_ID      VARCHAR2(20) 
EFFECTIVE_DTM     DATE 
ACCOUNT_STATUS     VARCHAR2(200) 
STATUS_REASON_TXT    VARCHAR2(255) 
ISVALID       NUMBER(1) 


Name         Type 
---------------------------------------------------------------------------- 
ORA_ERR_NUMBER       NUMBER 
ORA_ERR_MESG$       VARCHAR2(2000) 
ORA_ERR_ROWID$       ROWID 
ORA_ERR_OPTYP$       VARCHAR2(2) 
ORA_ERR_TAG$       VARCHAR2(2000) 
ACCOUNT_ID        VARCHAR2(4000) 
EFFECTIVE_DTM       VARCHAR2(4000) 
ACCOUNT_STATUS       VARCHAR2(4000) 
STATUS_REASON_TXT      VARCHAR2(4000) 
ISVALID        VARCHAR2(4000) 
+0

公用表的表结构是什么? –

+0

哪些DBMS使用..?指定您的样本数据和预期结果 – Mansoor

+0

您可以使用您的代码示例或仅发送使用表结构。 –

回答

0

对于开始你可以从select工会/工会,如果你知道所有的表名的所有查询所有的源表。否则,您可以使用pl/sql块使用动态查询为您执行此任务。

但是,如果您提供表结构和少量记录以及由您在评论部分中由同行评论完成某些工作,将会更容易。

编辑

才能上要求进一步明晰之后,我会建议把所有的其他列(从基表项基本)成一个单一的列 - 我们可以使用CLOB用于此目的。 你可以尝试像下面 -

***考虑ERR日志表为 -

create table err_log_tab (

ORA_ERR_NUMBER       NUMBER, 
ORA_ERR_MESG$       VARCHAR2(2000), 
ORA_ERR_ROWID$       ROWID, 
ORA_ERR_OPTYP$       VARCHAR2(2), 
ORA_ERR_TAG$       VARCHAR2(2000), 
table_name        varchar2(50), 
row_data        clob) 

下面的框可以执行这样做 -

DECLARE 
    l_sql  VARCHAR2(4000); 
    l_col_cnt NUMBER := 0; 
BEGIN 

    FOR l_err_tabs IN (SELECT table_name 
         FROM user_tab_cols 
         WHERE table_name LIKE 'ERR$_%' 
         AND column_name IN ('ORA_ERR_NUMBER', 
              'ORA_ERR_MESG$', 
              'ORA_ERR_ROWID$', 
              'ORA_ERR_OPTYP$', 
              'ORA_ERR_TAG$') 
         GROUP BY table_name 
         HAVING COUNT(*) = 5) 
    LOOP 
     l_sql := 'insert into err_log_tab select ORA_ERR_NUMBER,ORA_ERR_MESG$,ORA_ERR_ROWID$,ORA_ERR_OPTYP$,ORA_ERR_TAG$,''' || 
       substr(l_err_tabs.table_name, 
         6) || ''' table_name , to_clob(' || chr(10); 
     FOR l_cols IN (SELECT column_name 
         FROM user_tab_cols 
         WHERE table_name = l_err_tabs.table_name 
         AND column_id > 5 
         ORDER BY column_id) 
     LOOP 
     l_sql := l_sql || CASE 
        WHEN l_col_cnt = 1 THEN 
         '||'',''||' 
        ELSE 
         '' 
        END || '''"''||' || l_cols.column_name || '||''"'''; 
     l_col_cnt := 1; 

     END LOOP; 
     l_sql := l_sql || ') row_data from ' || l_err_tabs.table_name; 
     --dbms_output.put_line (l_sql); 
     EXECUTE IMMEDIATE l_sql; 

    END LOOP; 

END; 
/

如有指正我的理解带着问题走错了方向。

+0

多个源表具有不同的表结构并且它们刚创建完毕,因此没有行/记录存在。这些源表的相应错误表由包DBMS_ERRLOG.CREATE_ERROR_LOG创建。我需要创建并插入到所有这些错误日志 – span

+0

嗨Pratik任何建议? – span

+0

嗨@span,你的问题向我介绍了一些新的东西。谢谢.. 根据我对这个问题的理解,我们仍然可以使用动态查询考虑以'ERR $ _%'开头的所有表。请参阅我的回答中的版本。 –