如何从多个表中将数据插入到表中,其中所有表都具有公共前缀作为其表名
这是包生成的表和错误表的结构(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)
如果你知道所有的表名,你可以从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;
/
如果我对问题的理解方向错误,请纠正我。