为数据库中插入的记录创建文件

问题描述

我有一个 PLsql 应用程序,因此在应用程序的某些部分,当外部表中的条目与某些正则表达式匹配时,我需要将数据存储在来自外部表 (EXT_TAB_AUDIT_LOG) 的数据库表 (AUDIT_LOG) 中。 问题是我想同时创建一个文件,其中只包含插入到数据库中的外部表中的条目。

从外部表插入数据库的过程如下所示。

--------------------------------------------------------
--  DDL for Procedure PR_INSERT_AUDIT_LOG_FROM_FILE
--------------------------------------------------------
set define off;

  CREATE OR REPLACE EDITIONABLE PROCEDURE "ABC"."PR_INSERT_AUDIT_LOG_FROM_FILE" (P_IMPORT_TIMESTAMP IN TIMESTAMP)
AS 
BEGIN

   INSERT INTO AUDIT_LOG 
      ( ID,PRIMARY_NAME,PRIMARY_VALUE,TERMINAL_DATE,LAND_ID           
      )
   SELECT ID,TRIM(PRIMARY_NAME),TRIM(PRIMARY_VALUE),LAND_ID,P_IMPORT_TIMESTAMP
   FROM EXT_TAB_AUDIT_LOG AL
   LEFT OUTER JOIN VERFIY_NAME VWZ ON VWZ.VERFIY_TABLE_ID = TRIM(AL.VERFIY_TABLE_ID)
   WHERE REGEXP_LIKE (ID,'\d{2}-\d{2}-\d{2}')
   AND   PRIMARY_NAME IS NOT NULL
   AND   PRIMARY_VALUE IS NOT NULL
   AND   TERMINAL_DATE IS NOT NULL
   AND   LAND_ID IS NOT NULL
 


   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      DECLARE
         V_PROCEDURE_NAME  VARCHAR2(30)  := $$PLsql_UNIT;
         V_SUBJECT         VARCHAR2(255) := 'Error on DB procedure '||V_PROCEDURE_NAME||' on '||to_char(sysdate,'dd.mm.yyyy hh24:mi:ss');
         V_BODY            VARCHAR2(10000) := 'Hi all,'||chr(10)||chr(10)||'Procedure '||V_PROCEDURE_NAME||' returned the following error:'||chr(10)||sqlERRM;
      BEGIN
         SEND_MAIL ( 'GENERIC_DB_ERROR',V_SUBJECT,V_BODY);
         RAISE;
      END;  
END PR_INSERT_AUDIT_LOG_FROM_FILE;

/

如何创建一个文件,只存储数据库表中保存的记录,将正则表达式与外部表中的记录匹配,示例代码会有所帮助。

解决方法

您可以使用 utl_file 写入文件。

,

使用 UTL_FILE 包创建文件和写入数据。

示例:

DECLARE
-- declare file pointer variable
fp UTL_FILE.FILE_TYPE;
-- declare a cursor to fetch data from table
CURSOR c1 IS SELECT * FROM emp;
BEGIN
    -- open file
    fp := UTL_FILE.FOPEN('ABC','file4.txt','w');
    -- loop to fetch data
    FOR i IN c1
    LOOP
        -- write data into file
        UTL_FILE.PUT_LINE(fp,i.ename||' '||i.sal||' '||i.hiredate);
    END LOOP;
    -- close file
    UTL_FILE.FCLOSE(fp);
END;
/