Oracle

嵌套游標問題

  • May 10, 2017

我正在嘗試恢復我在表中所做的所有插入。我有一個遍歷表名的游標,第二個遍歷該表中所有行的游標,第三個遍歷所有列的游標。問題是我不能聲明動態行,因為它在執行時會給出異常。我的問題有什麼解決辦法嗎?或者你能建議另一種方法嗎?

這是程式碼:

declare
 cursor c_table is select table_name from user_tables;
 sql_query varchar2(100);
 rc sys_refcursor;
begin
 for v in c_table loop
   dbms_output.put_line('INSERT INTO ' || v.table_name ||' VALUES (');

     sql_query := 'select * from '||v.table_name;
     open rc for sql_query;    
     loop
       ---- here i want to fethc all the rows 
       declare
         sql_statement varchar2(200);
         v_column varchar2(50);
         re sys_refcursor;
       begin
         sql_statement := 'select column_name from user_tab_columns where table_name = '|| q'[']' || v.table_name || q'[']';
         open re for sql_statement;
         loop
           fetch rc into v_column;
           exit when rc%notfound;
         end loop;
         close re;
       end;
     end loop;
 end loop;
end;

試著把事情比你更深一層。

您正在創建動態 SQL 來獲取所需的資訊;相反,創建一個您將執行以執行實際更改的腳本。

在建構腳本時,您將獲取所需的所有表和列名數據,並建構必要的 SQL 命令以將數據從目前數據庫中拉出並將其寫入新數據庫。是的,您將為每個表創建一個單獨的腳本,但這很好 - 您不是通過複製和粘貼來創建它,而是通過一個過程來創建它,所以您知道它應該可以工作。而且,一旦它開始工作,您可以在需要時隨時生成新腳本,因此沒有維護成本。

創建腳本後(應該很快),您可以隨時執行它。如果需要,您甚至可以為單獨的測試劃分塊。

最簡單的方法是為一個表手動生成腳本。然後,查看特定於表和列的數據,並建構 SQL 以創建該腳本,填充動態 SQL 的表和列名稱。一旦為一張桌子準備好,它應該適用於所有人。

引用自:https://dba.stackexchange.com/questions/173136