存儲過程批量創建達夢dmfldr控制文件和執行命令


前言:在表數據量特別大的時候,需要使用到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM