如何计算一个sql文件中有多少sql语句?

如何计算一个sql文件中有多少sql语句?,sql,oracle,Sql,Oracle,因此,给定要在Oracle中执行的SQL文件,我们需要确定在SQL文件中要执行多少块。例如,在包含以下命令的SQL文件中有一个块 CREATE TABLE customer (id varchar2(42)); 以下SQL文件中的两个块 ALTER TABLE customer ADD name varchar2(42); ALTER TABLE customer DROP COLUMN id; 以及以下SQL文件中的三个块 CREATE OR REPLACE PROCEDURE print

因此,给定要在Oracle中执行的SQL文件,我们需要确定在SQL文件中要执行多少块。例如,在包含以下命令的SQL文件中有一个块

CREATE TABLE customer (id varchar2(42));
以下SQL文件中的两个块

ALTER TABLE customer ADD name varchar2(42);
ALTER TABLE customer DROP COLUMN id;
以及以下SQL文件中的三个块

CREATE OR REPLACE PROCEDURE printHelloWorld IS
BEGIN
    dbms_output.put_line('Hello World!');
END;
/

INSERT INTO customer VALUES ('ivan');

DROP TABLE customer;
除了在Oracle SQLDeveloper中执行输入时不会出现任何错误之外,我们不能对输入进行任何其他假设

更新


提问的目的是确保SQL文件中只有一条要执行的语句。我也愿意回答这个问题。如果能够创建一个脚本,将多语句SQL文件拆分为多个文件,那就更好了。

这不是一个完美的解决方案,但我认为在大多数情况下都能工作

首先创建一个duff用户,除了创建会话之外没有其他权限

CREATE USER duff IDENTIFIED BY "password";
GRANT CREATE SESSION TO duff;
然后将其与sqlplus和grep一起使用,以计算ORA错误-每个语句应该有一个错误

sqlplus duff/password@db < script.sql | grep -c ORA-
sqlplus-duff/password@db
如果您有ALTERSESSION语句,那么您需要更多

sqlplus duff/password@db < script.sql | grep -Ec 'ORA-|Session altered.'
sqlplus-duff/password@db

可能还有其他例外,但我认为它为您提供了一个可行的解决方案,只需很少的开销。请注意,脚本不会切换用户-但是如果脚本中有硬编码的用户名和密码,则会出现其他问题。

答案需要多准确?解决方案可能涉及一些第三方解析器,这些解析器都不是100%准确的。要直接讨论一个困难的解析问题,您是否愿意接受这样一个不能正确处理代码的解决方案:
declare test varchar2(100):=q'<'>;开始为空;结束它不必那么精确,只要在大多数情况下都是好的(因为这些SQL脚本将用于软件开发,这在大多数情况下可能是非恶意的。)@jonearles