将数据从多个表插入表中

时间:2016-11-28 05:48:45

标签: sql oracle11g oracle-sqldeveloper

如何从多个表中将数据插入到表中,其中所有表都具有公共前缀作为其表名

这是包生成的表和错误表的结构(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)

1 个答案:

答案 0 :(得分:0)

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

但如果您提供表格结构,并且在评论部分中由同行评论,您可以更轻松地说明您的表格结构和一些努力。

修改

在进一步明确要求后,我建议将所有其他列(基本上是基表中的条目)保存到一个列中 - 我们可以使用CLOB来实现此目的。 你可以试试下面的东西 -

***将错误的日志表视为 -

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;
/

如果我对问题的理解方向错误,请纠正我。