JavaScript 如何将 Oracle SQLPlus 脚本标记为单独的语句
How to tokenize a Oracle SQLPlus script into individual statements in JavaScript
我需要处理通常由应用程序中的 Oracle SQLPlus 处理的脚本内容。
脚本包含如下块:
- 评论(--这是评论)
- SQL加上突击队员(关闭回声)
- 普通 SQL 语句(select * 来自 dual;)
- PL/SQL 语句,如 (create function foo returning number as begin return 1; end;/)
而且我需要单独执行各个块。
是否有一种相当简单的方法来标记 JavaScript 中的语句,或者我是否需要一个完全理解 SQLPlus 语法的完整标记器?
最简单的方法是假设 SQL 脚本是以合理可读的方式编写的,并且每行有 1 个语句,或者语句被分成多行,你不会有一行中有多个语句的情况。
大多数情况可以通过以下方式处理:
阅读下一行和trim任何前导白色-space:
- 如果它以
SET
或 COLUMN
开头,那么您有一个 SQL/Plus 指令,它(通常)由一行组成;那一行是你的声明。
- 如果它以
CREATE FUNCTION
、CREATE PROCEDURE
、CREATE PACKAGE
、DECLARE
或 BEGIN
开头(以及后面的白色-space 字符) 然后你将有一个 PL/SQL 块,它将在单独的一行上以 /
终止,你可以阅读行直到找到它,这就是你的完整语句。
- 如果它以
--
开头,那么它是一条注释,您可以跳过该行的其余部分并将其添加到下一条语句之前(因为注释是下一条语句的一部分)。
- 如果它以
/*
开头,那么它是一个内联注释,您可以阅读到下一个 */
,然后通过处理该行的其余部分来重复(注释将被添加到下一条语句)。
- 否则,请阅读到行尾的下一个
;
(或后跟注释)(或单独一行的 /
),这就是您的完整陈述。
然后重复,阅读下一行。
这不能保证在 100% 的情况下都有效(即,如果你有多行字符串文字,而恰好在文字中一行的末尾有一个 ;
)。您应该查看输出以查看是否有任何其他情况需要处理,但对于相对简单的脚本来说它应该可以工作。
如果您的开发人员喜欢在同一行上编写包含多个语句的(可读性较差)脚本,那么您可能需要实现一个解析器。
我需要处理通常由应用程序中的 Oracle SQLPlus 处理的脚本内容。
脚本包含如下块:
- 评论(--这是评论)
- SQL加上突击队员(关闭回声)
- 普通 SQL 语句(select * 来自 dual;)
- PL/SQL 语句,如 (create function foo returning number as begin return 1; end;/)
而且我需要单独执行各个块。
是否有一种相当简单的方法来标记 JavaScript 中的语句,或者我是否需要一个完全理解 SQLPlus 语法的完整标记器?
最简单的方法是假设 SQL 脚本是以合理可读的方式编写的,并且每行有 1 个语句,或者语句被分成多行,你不会有一行中有多个语句的情况。
大多数情况可以通过以下方式处理:
阅读下一行和trim任何前导白色-space:
- 如果它以
SET
或COLUMN
开头,那么您有一个 SQL/Plus 指令,它(通常)由一行组成;那一行是你的声明。 - 如果它以
CREATE FUNCTION
、CREATE PROCEDURE
、CREATE PACKAGE
、DECLARE
或BEGIN
开头(以及后面的白色-space 字符) 然后你将有一个 PL/SQL 块,它将在单独的一行上以/
终止,你可以阅读行直到找到它,这就是你的完整语句。 - 如果它以
--
开头,那么它是一条注释,您可以跳过该行的其余部分并将其添加到下一条语句之前(因为注释是下一条语句的一部分)。 - 如果它以
/*
开头,那么它是一个内联注释,您可以阅读到下一个*/
,然后通过处理该行的其余部分来重复(注释将被添加到下一条语句)。 - 否则,请阅读到行尾的下一个
;
(或后跟注释)(或单独一行的/
),这就是您的完整陈述。
然后重复,阅读下一行。
这不能保证在 100% 的情况下都有效(即,如果你有多行字符串文字,而恰好在文字中一行的末尾有一个 ;
)。您应该查看输出以查看是否有任何其他情况需要处理,但对于相对简单的脚本来说它应该可以工作。
如果您的开发人员喜欢在同一行上编写包含多个语句的(可读性较差)脚本,那么您可能需要实现一个解析器。