Oracle
嵌套游標問題
我正在嘗試恢復我在表中所做的所有插入。我有一個遍歷表名的游標,第二個遍歷該表中所有行的游標,第三個遍歷所有列的游標。問題是我不能聲明動態行,因為它在執行時會給出異常。我的問題有什麼解決辦法嗎?或者你能建議另一種方法嗎?
這是程式碼:
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 的表和列名稱。一旦為一張桌子準備好,它應該適用於所有人。