问题描述
我有一个 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;
/