PLSQL使用方法簡單,平常使用較多,但在平常使用過程中,遇到一些問題,下面簡單羅列並進行解決。這些解決方法大多通過網絡查找獲得,這里只是進行簡單整理。
使用的數據庫版本為:Oracle11g。
通用方法:表結構和數據分開導出導入,通用方法可以解決很多問題,對於下面的錯誤頁可以通過這個方法進行解決。
方法說明:通過工具—>導出用戶對象 導出用戶表結構,可以通過編輯方式對表結構進行編輯后在導入的時候選擇導入表—>SQL插入方式導入表結構。
表結構導入后可以采用dmp導入導出的方式進行數據導入,對於部分表可以采用數據復制的方式進行數據導入。
1、在數據導出的時候,無法導出空表,提示錯誤“導出表報EXP-00011:table不存在”。
原因:11g默認創建一個表時不分配segment,只有在插入數據時才會產生(當然也可以強制分配),以節省磁盤空間。
解決方法:
第一種:在空表中插入一條數據然后再對插入的數據進行刪除,便可以進行數據導出(如果表少的話可以手動執行,對於多個表的情況可以采用語句進行批量操作的)。
第二種:可以使用手工為空表分配Extent的方式,來解決導出之前建立的空表的問題。
查找空表語句:select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
注意:我在查詢過程中可能查找的空表有遺漏,這個可以先進行一遍導出
把查詢結果導出,執行導出的語句即可。
導出結果可以通過語句導出,在PLSQL命令窗口執行下面語句:
set heading off;
set echo off;
set feedback off;
set termout on;
spool C:\allocate.sql;
Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off;
導出后執行導出語句
@ C:\allocate.sql;
第三種:設置deferred_segment_creation 參數,該參數值默認是TRUE,當改為FALSE時,無論是空表還是非空表,都分配segment。
需注意的是:該值設置后對以前導入的空表不產生作用,仍不能導出,只能對后面新增的表產生作用。如需導出之前的空表,只能用第一種方法。
在PLSQL中執行命令就下面第一句查看deferred_segment_creation屬性是否為true,如果為true則繼續執行后面一句進行更改即可。
show parameter deferred_segment_creation;
alter system set deferred_segment_creation = false;
2、對於包含大字段的表當表空間名稱改變時無法導出導入。
查看所有包含大字段的表名稱:select table_name from user_tab_columns where data_type='clob' or data_type='NCLOB'or data_type='BLOB'
對於這些表可以采用先建立表結構在通過導入數據方式進行。
3、可能由於權限設置原因,導致導入表的表空間名稱不正確。
可以采用通用方法進行表結構導出,然后進行編輯后在進行導入,在編輯的時候修改表空間名稱即可。