在SQuirreL中定义PostgreSQL函数:未终止的美元引用字符串

14

我有以下函数定义,用于PostgreSQL 9.3.4数据库:

CREATE OR REPLACE FUNCTION update_modified_timestamp()  
RETURNS TRIGGER AS $$
  BEGIN
    NEW.modified_at = now();
    RETURN NEW; 
  END;
$$ LANGUAGE plpgsql;

当我在SQuirreL(3.5.3或3.6)中尝试执行此操作时,我收到以下错误:

Error: ERROR: unterminated dollar-quoted string at or near "$$
 BEGIN
     NEW.modified_at = now()"
  Position: 77
SQLState:  42601
ErrorCode: 0

到目前为止,我学到了可以通过使用单引号来界定函数主体来减轻这个问题,例如:

CREATE OR REPLACE FUNCTION update_modified_timestamp()  
RETURNS TRIGGER AS '
  BEGIN
    NEW.modified_at = now();
    RETURN NEW; 
  END;
' LANGUAGE plpgsql;

我仍然想知道是否有其他解决办法 - 我认为这应该是可能的,因为Flyway可以执行此脚本,并且它使用了在SQuirreL中配置的完全相同的JDBC驱动程序。


更新:@a_horse_with_no_name指出这个错误与JDBC驱动程序无关,而是与SQuirreL如何解析SQL语句并将其拆分成块发送到数据库有关。 因此,剩下的问题是:SQuirreL能否原样/未解析地发送查询?我搜索了很多但找不到一种方法。


SQLFiddle也有同样的问题,但是单引号函数体甚至不能解决这个问题。 - Patrick
2
这与JDBC驱动程序无关。我猜Squirrel不知道$$之间的文本实际上是一个字符串文字,只会将函数定义发送到第一个;。Squirrel能否在不解析查询的情况下将其发送到数据库?如果您使用不同的分隔符,则在SQFiddle中可以正常工作:http://sqlfiddle.com/#!15/ce3fa3/2 - user330315
1个回答

18

您可以更改语句分隔符,以便不会在;上分割语句:

前往:会话会话属性SQL语句分隔符

尽管您无法将其更改为空字符串,但是您可以将其更改为例如// ,这样就可以执行问题中的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接