Postgresql 为什么在运行测试时控制台中出现美元报价错误,而在工作台上运行函数时却没有?
我的postgres函数有问题。 我已经创建了一个将数据从db复制到csv的函数 我曾尝试在工作台上运行该函数,但没有出现错误,但当我运行测试时,出现了美元引用错误 这就是功能: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
--------- 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运行测试时,我有一个错误对不起,我不明白答案,你能举一个快速的例子吗?谢谢。我不能,因为我不知道是什么处理@分隔符。也许您应该显示处理函数定义的实际代码。