创建函数错误错误:在“$$”处或附近未终止的美元引号字符串

Posted

技术标签:

【中文标题】创建函数错误错误:在“$$”处或附近未终止的美元引号字符串【英文标题】:Creating function error ERROR: unterminated dollar-quoted string at or near "$$ 【发布时间】:2019-09-12 20:37:07 【问题描述】:

无法创建 SQL 函数 - 导致 ERROR: unterminated dollar-quoted string at or near "$$

这是环境:Greenplum Database 5.20.1

我正在尝试创建一个函数,它将逗号分隔的数据元素的有序集合作为单个文本返回。我正在尝试使用 listagg 函数,但我发现它不支持使用 order by 同时还做一个 distinct。我已经将我正在尝试做的事情提炼成我认为我需要做的事情——即创建一个 SQL 函数,该函数在一个内联查询上使用 listagg 函数(已经删除了重复数据)。到现在为止还挺好。我已经有一段时间没有编写任何 Postgres 代码了,所以我生疏了。我什至正在努力正确地创建 SQL 函数。

DROP TABLE IF EXISTS test_table;

CREATE TABLE test_Table
    (
      abk            INTEGER NOT NULL
    , effective_date DATE NOT NULL
    , end_date       DATE NOT NULL
    , anattrib          CHARACTER (70) NOT NULL
    )
    WITH (OIDS = FALSE)
    DISTRIBUTED RANDOMLY;
INSERT INTO test_table(abk,effective_Date,end_date,anattrib) VALUES(1,'2019-01-01','2019-12-31','A');
INSERT INTO test_table(abk,effective_Date,end_date,anattrib) VALUES(1,'2019-06-01','9999-12-31','A');
INSERT INTO test_table(abk,effective_Date,end_date,anattrib) VALUES(1,'2019-01-01','2019-12-31','B');
INSERT INTO test_table(abk,effective_Date,end_date,anattrib) VALUES(1,'2020-01-01','9999-12-31','C');
COMMIT;

运行起来像这样的 SQL:

SELECT string_agg(myAlias.anattrib,', ' ORDER BY myAlias.anattrib)
FROM (SELECT DISTINCT anattrib FROM test_table 
  WHERE abk=1 AND '2019-06-01' BETWEEN effective_Date AND end_Date OR '2019-06-02' BETWEEN effective_Date AND end_Date) myAlias;

在一个看起来像这样的函数中:

CREATE OR REPLACE FUNCTION test_func(myBK INT, dt1 DATE, dt2 DATE) RETURNING VARCHAR(1000) AS
$$
  SELECT string_agg( myAlias.anattrib,', ' ORDER BY myAlias.anattrib) AS anattrib_list
  FROM 
  (SELECT DISTINCT anattrib FROM test_table WHERE abk= $1
  AND (($2 BETWEEN EFFECTIVE_DATE AND END_DATE) OR ($3 BETWEEN EFFECTIVE_DATE AND END_DATE))) myAlias; 
$$
LANGUAGE SQL;

我什至无法编译 SQL 函数 - 它给了我

ERROR: syntax error at or near "CREATE OR";
Error while executing the query. Error 7. SQLSTATE 42601
ERROR: unterminated dollar-quoted string at or near "$$
LANGUAGE SQL";
Error while executing the query. Error 7. SQLSTATE 42601

必须是简单的东西。但这似乎与我的 SQL 函数定义的语法相匹配。

【问题讨论】:

您使用哪个工具来运行它?也许那个工具不理解美元报价 【参考方案1】:

只需在功能代码中更改RETURNS的RETURNING子句:

  CREATE OR REPLACE FUNCTION test_func(myBK INT, dt1 DATE, dt2 DATE) RETURNS VARCHAR(1000) AS
$$
 SELECT string_agg( myAlias.anattrib,', ' ORDER BY myAlias.anattrib) AS anattrib_list
  FROM 
  (SELECT DISTINCT anattrib FROM test_table WHERE abk= $1
  AND (($2 BETWEEN EFFECTIVE_DATE AND END_DATE) OR ($3 BETWEEN EFFECTIVE_DATE 
  AND END_DATE))) myAlias; 
$$
  LANGUAGE SQL;

【讨论】:

以上是关于创建函数错误错误:在“$$”处或附近未终止的美元引号字符串的主要内容,如果未能解决你的问题,请参考以下文章

[Amazon](500310) 无效操作:"$$" 处或附近未终止的美元引号字符串

创建语法处或附近的 Plpgsql 函数错误

在“PARALLEL”处或附近创建 postgis 扩展语法错误

" " postgresql 函数处或附近的语法错误

Postgresql 字符串连接:错误:“msg”处或附近的语法错误

“TRUNCATE”处或附近的语法错误 - Aurora Postgres 10.12