You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Netezza存储过程创建不存在外部表报错,如何返回空表跳过缺失文件

解决方案

问题根因

你当前流程失败的核心原因有两个:

  • 单文件导入存储过程的异常捕获逻辑被注释,一旦文件不存在触发建表错误,会直接将异常抛给上层循环逻辑
  • 外层循环未做容错处理,单个文件执行失败会触发全局事务回滚,导致之前已经成功导入的文件也被回滚,全流程失败

改造步骤

1. 启用并优化单文件导入存储过程的异常捕获逻辑

把你代码中注释掉的异常部分放开,同时调整逻辑,确保单个文件出错时仅返回错误信息、不向上抛异常,同时修正了原代码中DATAOBJECT参数多余单引号的语法问题:

CREATE OR REPLACE PROCEDURE NAME(NATIONAL CHARACTER VARYING(200),
DATE, NATIONAL CHARACTER VARYING(200), CHARACTER VARYING(200),
NATIONAL CHARACTER VARYING(2), NATIONAL CHARACTER VARYING(10),
NATIONAL CHARACTER VARYING(20)) RETURNS CHARACTER VARYING(ANY) EXECUTE
AS CALLER LANGUAGE NZPLSQL AS BEGIN_PROC

 DECLARE    vAM_REC ALIAS FOR $1;   vDATE ALIAS FOR $2;   vDELOKNJ
ALIAS FOR $3; -- 文件存储路径  vFILENAME ALIAS FOR $4; -- 文件名
vPREFIX ALIAS FOR $5;   vVERSION ALIAS FOR $6;   vDB
ALIAS FOR $7;     vSQL NVARCHAR;   vDRP NVARCHAR; 

BEGIN

vDRP := 'DROP TABLE '||vDB||'..TABLE_NAME IF EXISTS';  EXECUTE
IMMEDIATE vDRP;    vSQL := 'CREATE EXTERNAL TABLE
'||vDB||'..TABLE_NAME ( COLUMN_1, COLUMN_2, COLUMN_3      )   USING (      
DATAOBJECT('''||vDELOKNJ||vFILENAME||''')       REMOTESOURCE
''ODBC''    DELIMITER '',''     MAXERRORS 1     QUOTEDVALUE ''DOUBLE''    
LOGDIR ''C:\TEMP''      SKIPROWS 1      )'      ; 
     EXECUTE IMMEDIATE vSQL; 


      vSQL := 'INSERT INTO
'||vDB||'..'||vPREFIX||'_TABLE_NAME_'||vVERSION||'            SELECT
              *           FROM
              TABLE_NAME          ';      EXECUTE IMMEDIATE vSQL;


DROP TABLE TMP_IFRS17_RAFM_OUTPUT_INDIVIDUAL IF EXISTS;
-- 成功时返回成功标识+对应年月
RETURN 'SUCCESS|'||to_char(vDATE,'YYYYMM');

EXCEPTION
WHEN OTHERS THEN
-- 输出错误提示,包含对应日期和文件名
RAISE NOTICE '日期%对应的文件%不存在或导入失败,错误信息:%',to_char(vDATE,'YYYYMM'),vFILENAME,SQLERRM;
-- 失败时返回失败标识+对应年月
RETURN 'FAILURE|'||to_char(vDATE,'YYYYMM'); 
END; END_PROC;

2. 改造外层循环存储过程,增加容错和事务控制

在外层循环遍历月度日期调用上述存储过程时,做如下调整:

  • 接收单文件存储过程的返回值,区分成功/失败状态做统计
  • 每次成功导入后执行COMMIT语句,避免单个文件失败回滚已导入的内容
  • 循环结束后输出整体统计:多少个文件导入成功,多少个文件缺失/失败

可选优化:提前做文件存在性校验

如果你的CSV文件存储在Netezza服务端可访问的路径,还可以在调用导入存储过程前,先调用admin.get_file_list系统存储过程遍历文件夹下的文件,匹配日期标识后只调用存在的文件对应的导入逻辑,减少异常触发。

内容的提问来源于stack exchange,提问作者S L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:57:04