使用包含空格、分号和正斜杠的 SQLPlus 执行脚本

Lei*_*fel 15 oracle oracle-11g-r2 sqlplus

有时我会得到一个可以在 SQL Developer 或 Toad 中正常运行的脚本,但需要修改才能从 SQL*Plus 中成功运行。这是一个最坏的例子,其中包含多个语句,每个语句都带有空行、分号和正斜杠:

INSERT INTO t1 VALUES ('a

;
/
');

INSERT INTO t1 VALUES ('b

;
/
');

DELETE FROM t1 WHERE c1 = 'c

;
/
';
Run Code Online (Sandbox Code Playgroud)

由于各种原因,这些语句需要从 SQL*Plus 运行。空行很容易用一个简单的...

set sqlblanklines on
Run Code Online (Sandbox Code Playgroud)

我知道 sqlterminator可以更改和/或关闭,但两者都需要修改代码,前者移动问题而不解决它,也不能解决嵌入的斜杠问题。

最好的答案是通过以某种方式改变环境(如 sqlblanklines 所做的),允许这些语句在不修改的情况下运行。如果这是不可能的,那么也许有一种方法可以以编程方式修改脚本。我试图避免手动更改。

ik_*_*elf 8

您可以通过使用 login.sql 来完成大部分工作。login.sql 在 - 令人惊讶的 - 登录期间执行,并从您的 SQLPATH 或当前目录加载。对于您给出的示例,您确实选择了最坏的情况。

问题是sqlterminator。无论你在那里放什么,正斜杠都会作为一个免费的 sqlterminator 维护。接下来,sqlplus 首先扫描 sqlterminator 并在扫描到字符串终止符之前执行此操作。如果你问我,这是一个错误。正斜杠可以用在字符串中,只要它不是单独的一行。一旦 sqlplus 找到指定为 sqlterminator 的字符,它就会忽略其他所有内容并停止读取。

可以处理正斜杠,只要它不是单独在一行上。

login.sql 包含:

prompt run login.sql
show sqlterminator
show sqlblanklines
set sqlblanklines on
set sqlterminator ';'
show sqlterminator
show sqlblanklines
prompt ready login.sql
set echo on
Run Code Online (Sandbox Code Playgroud)

leigh.sql 包含:

INSERT INTO t1 VALUES ('fail bc semicolon
a;a
/
'); 

INSERT INTO t1 VALUES ('fail bc solo /


aa
/
');

INSERT INTO t1 VALUES ('ok / not solo


aa
/a
');

DELETE FROM t1 WHERE a = 'c


a/
';
Run Code Online (Sandbox Code Playgroud)

运行脚本:

sqlplus leigh/leigh@orcl @leigh
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 22:36:20 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

run login.sql
sqlterminator ";" (hex 3b)
sqlblanklines OFF
sqlterminator ";" (hex 3b)
sqlblanklines ON
ready login.sql
SQL> INSERT INTO t1 VALUES ('fail bc semicolon
  2  a;a
  3  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('fail bc solo /
  2  
  3  
  4  aa
  5  /
ERROR:
ORA-01756: quoted string not properly terminated


SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL> 
SQL> INSERT INTO t1 VALUES ('ok / not solo
  2  
  3  
  4  aa
  5  /a
  6  ');

1 row created.

SQL> 
SQL> DELETE FROM t1 WHERE a = 'c
  2  
  3  
  4  a/
  5  ';

0 rows deleted.
Run Code Online (Sandbox Code Playgroud)

无需摆弄开始/结束块。无法处理命令内部的sqlterminator,无论它在什么地方,在字符串中与否,都不能在字符串中的一行中单独处理带有正斜杠的行。