当前位置: 首页 > 面试题库 >

使用包含$$字符的SQLExec执行文件

艾宁
2023-03-14
问题内容

我已经使用pg_dump创建了一个sql dump文件。此导出文件包含包含$$字符的函数。使用psql -f <文件名>导入文件没有问题。

如果要使用SQLExec任务使用ant导入文件,则会出现类似以下的异常:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$"

有没有办法导入包含$$的文件?

在postgres日志中,SQLExec任务似乎将$$转换为$,从而导致错误。

错误:字符87处“ $”处或附近的语法错误语句:CREATE FUNCTION
process_create_servicenumber()返回触发器语言plpgsql AS $开始,如果(TG_OP =’DELETE’)然后返回旧

这是我的方法

protected void importNewDbFromDumpFile() {

    final class SqlExecuter extends SQLExec {
        public SqlExecuter() {
            Project project = new Project();
            project.init();
            setProject(project);
            setTaskType("sql");
            setTaskName("sql");
        }
    }
    try {
        SqlExecuter executer = new SqlExecuter();
        executer.setSrc(new File(dbDumpFileLocation));
        executer.setClasspath(createClasspath());
        executer.setEscapeProcessing(true);
        executer.setDriver("org.postgresql.Driver");
        executer.setUrl("jdbc:postgresql://localhost/test");
        executer.setPassword("test");
        executer.setUserid("manager");
        executer.execute();
    } catch (Exception e) {
        log.info("Exception importing database ...", e);
    }
}

问题答案:

$$只是 美元报价的
最低要求。通过在美元之间放置一个字符串,使它(更多!)不太可能与所包含的文字中的字符串发生冲突:

CREATE OR REPLACE FUNCTION time_to_sec(timepoint timestamp with time zone)
  RETURNS bigint LANGUAGE plpgsql AS
**$BODY$**
DECLARE
 seconds bigint;
 secondsFromEpoch bigint;
 secondsFromMidnight bigint;
BEGIN
 secondsFromEpoch = EXTRACT(EPOCH FROM timepoint)::bigint;
 secondsFromMidnight = EXTRACT(EPOCH FROM CURRENT_TIMESTAMP::date)::bigint;
 seconds = secondsFromEpoch - secondsFromMidnight;
 return seconds;
END;
**$BODY$;**

更多建议

  • plpgsql中的赋值运算符为:== 未记录,在将来的版本中可能会消失。更多有关这个问题。

  • 使用CURRENT_DATE代替CURRENT_TIMESTAMP::date

  • 允许,但是我建议不要在plpgsql中使用大小写混合的参数名称。它们不区分大小写。

  • 最重要的是, 简化

    CREATE OR REPLACE FUNCTION time_to_sec2(timepoint timestamp with time zone)
    

    RETURNS bigint LANGUAGE plpgsql STABLE AS
    $BODY$
    BEGIN
    RETURN EXTRACT(EPOCH FROM timepoint - current_date)::bigint;
    END;
    $BODY$;

甚至:

    CREATE OR REPLACE FUNCTION time_to_sec3(timepoint timestamp with time zone)
  RETURNS bigint LANGUAGE sql AS
$BODY$
    SELECT EXTRACT(EPOCH FROM timepoint - current_date)::bigint;
$BODY$;
  • 可以宣布STABLE

还要注意,current_timestamp系列函数符合稳定条件,因为它们的值在事务中不会更改。

  • age()PostgreSQL中还有一个密切相关的功能几乎但不完全相同:它返回带有标准年和月的“符号”结果。因此,使用withage()可以在更长的时间内产生不同的结果。

这些都是等效的-除了最后两个偏差较长的时间之外:

WITH x(t) AS (VALUES ('2012-07-20 03:51:26+02'::timestamptz))
SELECT time_to_sec(t)  AS t1
      ,time_to_sec2(t) AS t2
      ,time_to_sec3(t) AS t3
      ,EXTRACT(EPOCH FROM t - current_date)::bigint AS t4
      ,EXTRACT(EPOCH FROM age(t, current_date))::bigint AS t5 -- deviates
      ,EXTRACT(EPOCH FROM age(t))::bigint * -1  AS t6  -- deviates
FROM   x;

关于原始问题:此PostgreSQL错误消息不一定表示问题出在美元符号上:

错误:“ $”或附近的语法错误

在大多数情况下,;在该行之前都会丢失该行。还是XML中未转义的特殊字符,例如< > &?美元符号$应该可以。但是我不是蚂蚁专家。PostgreSQL日志中应该有更多的上下文。



 类似资料:
  • 事情是这样的。我有一个术语存储在索引中,它包含特殊字符,比如'-',最简单的代码是这样的: 然后使用QueryParser创建一个查询,如下所示: 不使用QueryParser而直接使用TermQuery可以做我想做的事情,但是这种方式对于用户输入文本来说不够灵活。 我想可能StandardAnalyzer做了一些事情来省略查询字符串中的特殊字符。我尝试了debug,我发现字符串是拆分的,实际查询

  • 问题内容: 我有一个像这样的字符串: 基本上翻译为a ,我想将其替换为: 转换为。 用很多方法进行了尝试,但是它不起作用可能是因为以不同的方式使用了新行。我尝试了: …以及许多其他方式都没有结果。任何想法在这种情况下如何更换? 问题答案: 使用gawk尝试以下行: 如果要 处理新行,则必须先阅读整个文件:

  • 问题内容: 我正在尝试在NetBeans 6.0.1中使用OpenCSV解析.csv文件。我的文件包含一些Unicode字符。当我在输出中写入字符时,字符以其他形式显示,例如(HJ1’-E /;)。当我在记事本中打开此文件时,它看起来还可以。 我使用的代码: 问题答案: 首先,您需要知道文件的编码格式,例如UTF-8或UTF-16。生成此文件的原因是什么? 在那之后,它相对简单- 您需要创建一个包

  • 如何在包含字符的文件上执行gradle processResources,而不转义文件中的字符? 我有一些静态html文件,位于Spring Boot参考文档建议的“资源/静态”文件夹中。然而,当我尝试执行gradle processResources时,gradle抛出了一个异常 据我所知,出现此问题的原因是,其中一个静态文件中有一个字符,并且在处理资源时,它是表达式的保留字符。 建议的解决方案

  • 我正在尝试使用DOMParser解析带有HTML字符串的XML文件。问题是getTextContent()方法只获取文本,而不获取其中的任何HTML标记。我希望字符串按原样返回,而不是按解析后的版本返回。我搜索了整个网络,却找不到任何对我有帮助的东西。顺便说一句,我无法对HTML字符串进行任何更改,因为在大约500个文件中有超过100k个Sting。 测验xml文件 Java模块 实际输出 这里有

  • 我在https://github.com/owlcs/owlapi/tree/master/contract/src/test/java.org/coode/owlapi/example上运行owlapi示例,以检索具有奇数字符的类的子类。我的owl文件包含带有奇数字符的类,如/,(但解析器似乎在奇数字符之前截断它们,并最终抛出一个错误。我查看了ManchesterOWLSyntaxTokeniz