首页 > 解决方案 > 如何将从.bat文件中的复制命令返回的错误插入到表中

问题描述

cd C:\Program Files\pgAdmin 4\v5\runtime
psql -h "Hostname" -p "5432" -U "user_name" -d "dbname" -c "\COPY (SELECT * FROM schema_name.table_name) TO "C:\ExportFromStaging\outputfile.csv" WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, QUOTE '\"', ESCAPE '''',DELIMITER ';')

期待 :

如果命令中发生任何错误copy,我想在局部变量或表中捕获从数据库八重返回的错误

示例批处理文件:

cd C:\Program Files\pgAdmin 4\v5\runtime
psql -h "Hostname" -p "5432" -U "user_name" -d "dbname" -c "\COPY (SELECT * FROM schema_name.table_name) TO "C:\ExportFromStaging\outputfile.csv" WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, QUOTE '\"', ESCAPE '''',DELIMITER ';')


if error 
then 
insert into error_log (error_message,error_time)
values (@ERRROR_RETURNED_FROM_DATABASE_IFCOPPYING_WENT_WRONG,timestamp);

echo @ERRROR_RETURNED_FROM_DATABASE_IF_COPPYING_WENT_WRONG
```

标签: postgresqlbatch-fileexport-to-csvpostgresql-9.5

解决方案


我不知道postgress,但我可以冒险解决。从 psql 手册:

如果 psql 正常完成,则返回 0 给 shell,如果发生自己的致命错误(例如内存不足,找不到文件),则返回 1,如果与服务器的连接出错并且会话不是交互式的,则返回 2,如果脚本中发生错误并且设置了变量 ON_ERROR_STOP。

你可以试试:

setlocal EnableDelayedExpansion

rem use double quote if there is space in filename.
cd "C:\Program Files\pgAdmin 4\v5\runtime"

rem psql command.
psql -h "Hostname" -p "5432" -U "user_name" -d "dbname" -c "\COPY (SELECT * FROM schema_name.table_name) TO "C:\ExportFromStaging\outputfile.csv" WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, QUOTE '\"', ESCAPE '''',DELIMITER ';')

if %ERRORLEVEL% GEQ 1 (
   IF %ERRORLEVEL% EQU 1 set "result=psql fatal error."
   IF %ERRORLEVEL% EQU 2 set "result=psql connection to the server went bad."
   IF %ERRORLEVEL% EQU 3 set "result=psql error occurred in a script: '%ON_ERROR_STOP%'"
   echo psql error: [!date! !time!] !result!
   :: you can change "timestamp" with variable !date! !time!
   :: pseudocode:
   :: insert into error_log (error_message,error_time) values ("!result!","!date! !time!");
) else (
  IF %ERRORLEVEL% EQU 0 echo psql finished normally.
)


推荐阅读