如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句

Posted

技术标签:

【中文标题】如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句【英文标题】:How to tokenize a Oracle SQLPlus script into individual statements in JavaScript 【发布时间】:2021-04-25 11:52:05 【问题描述】:

我需要处理通常由 Oracle SQLPlus 在应用程序中处理的脚本内容。

脚本包含如下块:

cmets(--这是一条评论) SQLPlus 突击队(设置回显关闭) 普通 SQL 语句(select * from dual;) PL/SQL 语句,如(创建函数 foo,返回数字作为开始返回 1;结束;/)

我需要单独执行各个块。

是否有一种相当简单的方法来标记 javascript 中的语句,或者我需要一个完全理解 SQLPlus 语法的完整标记器?

【问题讨论】:

如果某些命令或 SQL 语法特定于 sqlplus(例如 set echo off,或使用 & 的变量替换),它们将不会转换为其他任何内容。 我知道 sqlplus 特定的语法需要单独处理,但我的主要问题是如何在没有完整解析器的情况下将它们“分离”成单独的标记。 【参考方案1】:

最简单的方法是假设 SQL 脚本以合理可读的方式编写,并且每行有 1 个语句,或者语句被拆分为多行,并且您不会遇到有多个语句的情况单行语句。

大多数情况可以通过以下方式处理:

阅读下一行并修剪任何前导空白:

如果它以SETCOLUMN 开头,那么您有一个SQL/Plus 指令,它(通常)由一行组成;该行是您的声明。 如果它以CREATE FUNCTIONCREATE PROCEDURECREATE PACKAGEDECLAREBEGIN(以及后面的空格字符)开头,那么您将拥有一个 PL/SQL 块,该块将以/ 在单独的行中,您可以阅读行,直到找到它,这就是您的完整声明。 如果它以 -- 开头,那么它是一个注释,您可以跳过该行的其余部分并将其添加到下一条语句之前(因为 cmets 是下一条语句的一部分)。 如果它以/* 开头,那么它是一个内联注释,您可以一直阅读到下一个*/,然后通过处理该行的其余部分来重复(注释将添加到下一条语句之前)。李> 否则,请阅读到下一个位于行尾的;(或后跟注释)(或单独一行的/),这就是您的完整陈述。

然后重复,阅读下一行。

这不能保证在 100% 的情况下都有效(即,如果您有多行字符串文字,而在文字中的一行末尾恰好有一个 ;)。您应该查看输出以查看是否有任何其他情况需要处理,但对于相对简单的脚本,它应该可以工作。

如果您的开发人员喜欢在同一行上编写包含多个语句的(可读性较差)脚本,那么您可能需要实现一个解析器。

【讨论】:

以上是关于如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句的主要内容,如果未能解决你的问题,请参考以下文章

如何导出ORACLE指定存储过程

用 mysql 命令替换 sqlplus 命令

oracle之spool详细使用总结(转)

sqlplus多行代码怎么

如何从 Sqlplus 输出中删除下划线

oracle数据量巨大表查询时间太长,sqlplus有的不能spool出结果