【问题标题】:Why does H2 balk at line continuation '\' in stored procedures?为什么 H2 在存储过程中的行继续“\”处犹豫不决?
【发布时间】:2011-06-16 23:56:36
【问题描述】:

(1) 尝试使用行尾继续标记创建内联存储过程。以下是用户手册中的 NEXT_PRIME 示例,其中添加了行尾连续标记:

DROP ALIAS IF EXISTS NEXT_PRIME;
CREATE ALIAS NEXT_PRIME AS $$ \
    String nextPrime(String value) { \
        return new BigInteger(value).nextProbablePrime().toString(); \
    } \
$$;

(2) 观察错误:

SQL 语句中的语法错误“/org/h2/dynamic/NEXT_PRIME.java:7: 非法字符: \92 公共静态\ ^ ...等

我问这个问题是有充分理由的。如果在“$$”块中正确支持行继续,则可以在普通的 java 字符串属性资源文件中使用普通的多行 SQL 语句来保留/维护多行存储过程。是的,我在这里写的内容意味着 H2 中的普通 SQL 语句允许行继续。例如:

//stringid=\
create table if not exists test(\
     id int,\
     name varchar,\
); 

上面的包含字符串id“//stringid”的SQL create语句可以从java属性文件列表中直接剪切粘贴到H2控制台,执行不会出错!

【问题讨论】:

    标签: database h2


    【解决方案1】:

    Java 和 SQL 数据库不需要或允许使用续行字符。如果出于某种原因需要它们,请在执行语句之前删除它们。

    【讨论】:

      【解决方案2】:

      Thomas,您的答案对 Java 来说是一个不错的答案,但与任何其他 SQL 存储过程实现的内联翻译单元属性相比,它就不是那么好。显然,不会将延续字符放在 Java 编译单元中,但由于 SQL 中允许使用 '\' 后跟 '\n' 延续,因此应该允许在 $$ 块中使用内联 H2 Java。 [大概在将内联代码提交给Java编译器之前会过滤掉继续标记。]

      H2 的目标不是与其他常见的 SQL 实现竞争吗?如果是这样,为什么要打破存储过程的翻译单元的 SQL 概念?存储过程语法在每个实现中有所不同,但每个实现都将存储过程代码视为 SQL。

      【讨论】:

      • 其实我测试的任何SQL数据库都不允许使用`\`,除了H2。这可能是一个错误(我会检查)。
      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 2023-03-15
      • 2010-11-19
      • 2010-10-17
      • 1970-01-01
      • 2015-03-28
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多