为啥 H2 在存储过程中的行继续“\”处犹豫不决?

Posted

技术标签:

【中文标题】为啥 H2 在存储过程中的行继续“\\”处犹豫不决?【英文标题】: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控制台,执行不会出错!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

其实我测试的任何SQL数据库都不允许使用`\`,除了H2。这可能是一个错误(我会检查)。

以上是关于为啥 H2 在存储过程中的行继续“\”处犹豫不决?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Arraylist<String> 作为长且随机的字符串存储在 H2 数据库中?

迭代存储过程 BigQuery 中的行

为啥这个函数序言中没有“sub rsp”指令,为啥函数参数存储在负 rbp 偏移处?

在 H2 数据库中编写复杂的存储过程

sqlserver profiler为啥跟踪不到自定义的存储过程执行情况

H2:如何创建没有参数的存储过程