【问题标题】:Inserting data into a table from multiple tables从多个表中插入数据到一个表中
【发布时间】:2016-11-28 05:48:45
【问题描述】:

如何将多个表中的数据插入到一个表中,其中所有表都有一个共同的前缀作为它们的表名

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

【问题讨论】:

  • 常用表的表结构是怎样的?
  • 哪个 DBMS 使用..?指定您的示例数据和预期结果
  • 您可以发送使用您的代码示例还是只发送使用表结构。
  • 公用表实际上是由过程 DBMS_ERRLOG.CREATE_ERROR_LOG 创建的,所以表名以 'ERR$_' 开头。这些普通表的表结构是,前五列是程序添加的,其余列是错误时引用的表

标签: sql oracle11g oracle-sqldeveloper


【解决方案1】:

首先,如果您知道所有表名,则可以在联合/联合所有查询中从所有源表中 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;
/

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

【讨论】:

  • 多个源表的表结构不同,而且刚刚创建,所以不存在行/记录。这些源表的相应错误表已由包 DBMS_ERRLOG.CREATE_ERROR_LOG 创建。我需要创建所有这些错误日志并将其插入到表中
  • 嗨,Pratik 有什么建议吗??
  • 嗨@span,你的问题向我介绍了一些新的东西......谢谢......根据我对这个问题的理解,考虑到所有以'ERR$_%'开头的表,我们仍然可以使用动态查询。请参考我的回答中的版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多