如何将 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 个语句,或者语句被拆分为多行,并且您不会遇到有多个语句的情况单行语句。
大多数情况可以通过以下方式处理:
阅读下一行并修剪任何前导空白:
如果它以SET
或COLUMN
开头,那么您有一个SQL/Plus 指令,它(通常)由一行组成;该行是您的声明。
如果它以CREATE FUNCTION
、CREATE PROCEDURE
、CREATE PACKAGE
、DECLARE
或BEGIN
(以及后面的空格字符)开头,那么您将拥有一个 PL/SQL 块,该块将以/
在单独的行中,您可以阅读行,直到找到它,这就是您的完整声明。
如果它以 --
开头,那么它是一个注释,您可以跳过该行的其余部分并将其添加到下一条语句之前(因为 cmets 是下一条语句的一部分)。
如果它以/*
开头,那么它是一个内联注释,您可以一直阅读到下一个*/
,然后通过处理该行的其余部分来重复(注释将添加到下一条语句之前)。李>
否则,请阅读到下一个位于行尾的;
(或后跟注释)(或单独一行的/
),这就是您的完整陈述。
然后重复,阅读下一行。
这不能保证在 100% 的情况下都有效(即,如果您有多行字符串文字,而在文字中的一行末尾恰好有一个 ;
)。您应该查看输出以查看是否有任何其他情况需要处理,但对于相对简单的脚本,它应该可以工作。
如果您的开发人员喜欢在同一行上编写包含多个语句的(可读性较差)脚本,那么您可能需要实现一个解析器。
【讨论】:
以上是关于如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句的主要内容,如果未能解决你的问题,请参考以下文章