Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为什么在运行测试时控制台中出现美元报价错误,而在工作台上运行函数时却没有?_Postgresql_Function_Sql Workbench J_Dollar Quoting - Fatal编程技术网

Postgresql 为什么在运行测试时控制台中出现美元报价错误,而在工作台上运行函数时却没有?

Postgresql 为什么在运行测试时控制台中出现美元报价错误,而在工作台上运行函数时却没有?,postgresql,function,sql-workbench-j,dollar-quoting,Postgresql,Function,Sql Workbench J,Dollar Quoting,我的postgres函数有问题。 我已经创建了一个将数据从db复制到csv的函数 我曾尝试在工作台上运行该函数,但没有出现错误,但当我运行测试时,出现了美元引用错误 这就是功能: --------- the @DELIMITER / is necessary in order to sent sql statement with mybatis... -- @DELIMITER / / CREATE OR REPLACE FUNCTION save_audit_deletions(IN day

我的postgres函数有问题。 我已经创建了一个将数据从db复制到csv的函数

我曾尝试在工作台上运行该函数,但没有出现错误,但当我运行测试时,出现了美元引用错误

这就是功能:

--------- the @DELIMITER / is necessary in order to sent sql statement 
with mybatis...
-- @DELIMITER /
/
CREATE OR REPLACE FUNCTION save_audit_deletions(IN days numeric, IN table_name text) 
RETURNS void AS
$body$
DECLARE
   interval INT;
   statement_copy text;
   statement_count text;
   copied_rows INTEGER; --number of rows copied by COPY
   backup_rows INTEGER; --number of rows that COPY needs to copy into csv
BEGIN

    UPDATE table_name SET backup = 1 WHERE backup = 0 AND creationdate >= now()::DATE - days AND creationdate < now()::DATE;

    statement_copy := 'COPY (SELECT * FROM table_name WHERE backup = 1) TO ''/var/audiobays/logs/audit/' || table_name || '_deletions_(' || date-days|| ').csv'' CSV DELIMITER '','' HEADER;';
    execute statement_copy 
    into copied_rows;

    statement_count := 'SELECT COUNT (*) FROM table_name WHERE backup = 1';
    execute statement_count 
    into backup_rows;

    IF copied_rows = backup_rows THEN
        DELETE FROM table_name WHERE backup = 1;
    ELSE
        UPDATE table_name SET backup = 0 WHERE backup = 1;
    END IF;
END
$body$
LANGUAGE plpgsql;
/
-- @DELIMITER ;     
这就是错误所在

Error executing: CREATE OR REPLACE FUNCTION save_audit_deletions(IN days numeric, IN table_name text) 
RETURNS void AS
$body$
DECLARE
   interval INT;
   statement_copy text;
   statement_count text;
   copied_rows INTEGER; --number of rows copied by COPY
   backup_rows INTEGER; --number of rows that COPY needs to copy into csv
BEGIN
    UPDATE table_name SET backup = 1 WHERE backup = 0 AND creationdate >= now()::DATE - days AND creationdate < now()::DATE;
   statement_copy := 'COPY (SELECT * FROM table_name WHERE backup = 1) TO ''/var/audiobays/logs/audit
.  Cause: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 104 in SQL CREATE OR REPLACE FUNCTION 


. Expected terminating $$
Error executing:   execute statement_copy 


.  Cause: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 328 in SQL   execute statement_copy 

. Expected terminating $$

不管是什么解释@DELIMITER/,它可能会被包含斜杠的/var/audiobays/logs/audit/弄糊涂


尝试使用“函数体中不显示的”这样的分隔符。

-@delimiter/在psql中不执行任何操作,您指的是哪个工作台?我指的是sql workbench/J。我的代码保存在db_test.sql文件中。这个项目是用java-@DELIMITER/编写的,在sqlworkbench/J或JDBC中也不做任何事情-如何在java代码中运行该语句?我知道。如果在代码中删除-@DELIMITER/。错误是什么?因为我有一个美元报价错误,所以我在运行测试的同时运行函数。当我用jUnit运行测试时,我有一个错误对不起,我不明白答案,你能举一个快速的例子吗?谢谢。我不能,因为我不知道是什么处理@分隔符。也许您应该显示处理函数定义的实际代码。