2012-08-01 61 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

回答