前言:在表數據量特別大的時候,需要使用到dmfldr快速導入導出數據,如果表的數量特別多,手動創建費時費力,所以現在提供一個用存儲過程創建的方式。
一、創建效果
1、先來看一下用存儲過程創建了哪些東西。
2、下面是其中一個控制文件
3、執行命令
二、創建存儲過程
1、在數據庫實例目錄下創建package文件夾和data文件夾
E:\dmdbms\data\DAMENG2\package 存放控制文件和腳本語句
E:\dmdbms\data\DAMENG2\data 存放導出的數據
注意:一定要在數據庫實例下,不然會報權限不足。
2、存儲過程語句解析
1)、UTL_FILE 包
UTL_FILE 包是PL/SQL 程序提供讀和寫操作系統數據文件的功能。
2)、使用包內的過程和函數之前,如果還未創建過系統包。請先調用系統過程創建系統包。
SP_CREATE_SYSTEM_PACKAGES (1,'UTL_FILE');
3)、UTL_FILE 定義了一種 FILE_TYPE 記錄類型。FILE_TYPE 類型是 UTL_FILE 專有類型。
4)、utl_file.fopen
當用戶想讀取或寫一個數據文件的時候,可以使用 FOPEN 來返回的文件句柄。這個文件句柄將用於隨后在文件上的所有操作。
第一個參數是源文件路徑,第二個參數是文件名稱,第三個參數是文件打開模式,A代表附加模式,R代表只讀模式,W代表寫模式,當以"A"的方式打開文件時,若該文件不存在,則以"W"的方式創建該文件。
3、調用存儲過程
call dmhr.DMFLDR_CTL_DATA('E:\dmdbms\data\DAMENG2\package\','DMHR','E:\dmdbms\data\DAMENG2\data\','SYSDBA','SYSDBA','LOCALHOST','5237');
三、導出
1、創建導出腳本exetable.bat,並把E:\dmdbms\data\DAMENG2\package\dmfldr.txt文件中的執行語句copy到執行腳本中。
2、執行腳本
在E:\dmdbms\bin目錄下cmd
call E:\dmdbms\data\DAMENG2\package\exetable.bat
3、執行效果
四、導入
1、創建導入腳本exeintotable.bat,並把E:\dmdbms\data\DAMENG2\package\dmfldr.txt文件中的執行語句copy到執行腳本中,把mode='OUT'刪除即可。或者直接復制黏貼導出腳本再刪除mode='OUT'。
2、執行導入腳本
3、導入效果
原本只有11條記錄,現在有22條記錄。
五、最后附上存儲過程創建語句
--參數說明
--FILE_PATH 生成的控制文件路徑(為數據庫實例位置,不然會報權限不足),生成的執行腳本中已指向該目錄,無需移動
--V_SEC_NAME 導出模式名
--DATA_FILE 生成數據文件位置
--USER_NAME 用戶名
--PASSWORD 密碼
--變量說明
--l_file 對應的是控制文件,有幾張表生成幾個控制文件
--exec_file 只生成一個文件,存放執行命令,copy進執行腳本即可
create or replace procedure DMHR.DMFLDR_CTL_DATA(FILE_PATH STRING,v_SEC_NAME STRING,
DATA_FILE STRING,USER_NAME STRING,PASSWORD STRING,IP STRING,PORT STRING)
is
l_file utl_file.file_type;--控制文件,有幾張表生成幾個
exec_file utl_file.file_type;--存放執行命令,只生成一個文件,把該文件內容copy進執行腳本即可
i int;
begin
exec_file:=utl_file.fopen(FILE_PATH, 'dmfldr.txt', 'A');--存放執行命令的文件的名稱為dmfldr.txt
--獲取模式下所有的表並循環創建控制文件和執行腳本
for a in(select * from all_tables where OWNER=v_SEC_NAME) loop
l_file :=utl_file.fopen(FILE_PATH, a.TABLE_NAME||'.ctl', 'A');
utl_file.putf(exec_file, 'dmfldr.exe userid='|| USER_NAME||'/'||PASSWORD ||'@'||IP||':'||PORT||' control=');
utl_file.putf(exec_file, '''');
utl_FILE.putf(exec_file, FILE_PATH );
utl_file.putf(exec_file, a.TABLE_NAME||'.ctl''');
utl_file.putf(exec_file, ' ');
utl_file.putf(exec_file, 'mode='||'''OUT''');
UTL_FILE.putf(exec_file, '\n');
--utl_file_putf(exec_file,'\N');
utl_file.putf(l_file, 'LOAD DATA');
utl_file.putf(l_file, '\nINFILE');
utl_file.putf(l_file, ' ');
utl_file.putf(l_file, '''');
utl_file.putf(l_file, DATA_FILE);
utl_file.putf(l_file, a.TABLE_NAME||'.txt''');--數據文件名稱
UTL_file.putf(L_file, '\nINTO TABLE');
utl_file.putf(l_file, ' ');
utl_file.putf(l_file, v_SEC_NAME||'.'||a.TABLE_NAME);
utl_file.putf(l_file, '\nFIELDS ''|''');
UTL_FILE.putf(l_file, '\n(');
i :=0;
--循環封裝表下的列信息,新版本達夢數據庫已支持簡化方式,控制文件指定表即可,不用指定字段信息了,當然
for b in ( select * from all_tab_columns where owner = v_SEC_NAME and table_name=a.TABLE_NAME ) loop
utl_file.putf(l_file, b.COLUMN_NAME);
i :=i+1;
if i < (select count(*) from all_tab_columns where owner = V_SEC_NAME and table_name = a.TABLE_NAME )
then utl_file.putf(l_file, ',');
end if;
UTL_FILE.putf(l_file, '\n');
end loop;
UTL_FILE.putf(l_file, '\n)');
UTL_FILE.putf(l_file, '\n');
end loop;
utl_file.fclose(l_file);
utl_file.fclose(exec_file);
end;
--調用實例
call dmhr.DMFLDR_CTL_DATA('E:\dmdbms\data\DAMENG2\package\','DMHR','E:\dmdbms\data\DAMENG2\data\','SYSDBA','SYSDBA','LOCALHOST','5237');
更多資訊請上達夢技術社區了解: https://eco.dameng.com