2012-08-01 60 views
0

我是很新,甲骨文所以不能完全肯定這是可能的,或者也許我會約了錯誤的方式,但這裏去...PL/SQL動態表名

部分老的我正在修復的饋線腳本循環了〜20個表格(可以隨時更改)來填充相關的登臺表格。這部分是目前非常基本:

... 

INSERT INTO staging_tbl_1(
    SELECT * 
    FROM source_tbl_1  
); 

INSERT INTO staging_tbl_2(
     SELECT * 
     FROM source_tbl_2  
); 

... 

一些在源數據庫中的字段有不同的限制等,這意味着每一個現在,然後它會拋出一個異常和饋線將停止。我希望做的是在現有的饋線包中創建一個過程,以便在每個記錄插入之前遍歷每條記錄中的每一行,並將其包裝在一個例外塊中。這樣可以記錄而不會導致進紙器停止。

基本上我追這樣的事情:

BEGIN procedure_x(source_record, staging_record) 

    -- Perform validation to ensure records exit 

    -- Loop through all record rows 
    FOR row IN (SELECT * FROM source_record) LOOP 

    -- Wrap in exception block 

    -- Insert into staging record 

    -- Log exception if it occurs 
    END LOOP;   
END 

我已經嘗試引用遊標但爲了讓他們的工作我還需要預先知道行類型(從我有限的瞭解) 。我也嘗試立即執行,但我無法找到一種方法來以適當的方式來循環。還有其他方法可以解決這個問題嗎?

附加:

我意識到,我們真正應該解決問題的根源,而不是繞了這個樣子,可惜它是迄今爲止我國的影響範圍之外。

可以做到這一點,而無需做一個單獨的過程,只是將所有的表格引用包裝在一個循環中,但是我想把它作爲最後的手段。

+0

你嘗試'EXECUTE IMMEDIATE'和'BULK COLLECT'記錄到一個關聯數組,你可以再遍歷?這可能會解決您的循環問題。 – Ollie 2012-08-01 08:32:33

+0

嗨Ollie,感謝您的回覆 - 不幸的是,如果我對批量收集的理解是正確的,那麼在執行它之前,我仍然必須知道行類型是什麼。我目前正在研究dbms_sql並創建一個過程來通過all_tables等動態創建所有這些。但是,對於這樣一個小的修復 - 這是非常麻煩 - 如果任何人有另一個想法,請讓我知道:) – Chris 2012-08-01 09:16:26

+2

你可以包裝anon 。阻止for循環內的插入語句 - 看看我以前的問題[繼續在Oracle引發異常時插入](http://stackoverflow.com/q/1065829) – Sathya 2012-08-01 09:26:43

回答