2016-11-28 63 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 $ _%'開頭的所有表。請參閱我的回答中的版本。 –