SQL*Plus无法执行SQL Developer可以执行的SQL脚本

12
我遇到了一个非常烦人的问题。我在Notepad++中编写了一些SQL脚本。现在,当我尝试通过命令行(在Windows 7上)通过SQL*Plus执行它们时,我会收到像ORA-00933: SQL command not properly ended这样的错误。
然后,我将脚本复制并粘贴到SQL Developer工作表窗口中,点击运行按钮,脚本就可以无错误地执行。
经过长时间的调查,我认为SQL*Plus对一些空格(包括换行符和制表符)存在问题,它无法理解它们。
由于我认为SQL Developer知道如何去除奇怪的空格,所以我尝试了这个方法:将脚本粘贴到SQL Developer工作表窗口中,然后从那里复制并粘贴回SQL脚本中。这解决了某些文件的问题,但不是所有文件。有些文件在某些地方出现错误,原因不明。
你是否遇到过这个问题?我应该怎么做才能通过命令行的SQL*Plus运行这些脚本?
更新:
以下是一个脚本示例,在SQL*Plus中无法工作,但在SQL Developer中可以正常工作:
SET ECHO ON;

INSERT INTO MYDB.BOOK_TYPE (
    BOOK_TYPE_ID, UNIQUE_NAME, DESCRIPTION, VERSION, IS_ACTIVE, DATE_CREATED, DATE_MODIFIED
)
SELECT MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Book-Type-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Description-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, A.VERSION, B.IS_ACTIVE, SYSDATE, SYSDATE FROM

    (SELECT (LEVEL-1)+0 VERSION FROM DUAL CONNECT BY LEVEL<=10) A,
    (SELECT (LEVEL-1)+0 IS_ACTIVE FROM DUAL CONNECT BY LEVEL<=2) B

;

我收到的错误:

SQL> SQL> SET ECHO ON;
SQL>
SQL> INSERT INTO MYDB.BOOK_TYPE (
  2      BOOK_TYPE_ID, UNIQUE_NAME, DESCRIPTION, VERSION, IS_ACTIVE, DATE_CREATED, DATE_MODIFIED
  3  )
  4  SELECT MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Book-Type-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, 'Description-' || MYDB.SEQ_BOOK_TYPE_ID.NEXTVAL, A.VERSION, B.IS_ACTIVE, SYSDATE, SYSDATE FROM
  5  
SQL>         (SELECT (LEVEL-1)+0 VERSION FROM DUAL CONNECT BY LEVEL<=10) A,
  2          (SELECT (LEVEL-1)+0 IS_ACTIVE FROM DUAL CONNECT BY LEVEL<=2) B
  3  
SQL> ;
  1     (SELECT (LEVEL-1)+0 VERSION FROM DUAL CONNECT BY LEVEL<=10) A,
  2*    (SELECT (LEVEL-1)+0 IS_ACTIVE FROM DUAL CONNECT BY LEVEL<=2) B

你可以看到错误出现在 (SELECT (LEVEL-1)+0 IS_ACTIVE FROM DUAL CONNECT BY LEVEL<=2) B 这一行(由于某种原因,在所有遇到这个错误的文件中,错误都出现在结束分号之前的最后一行)。


1
你能否提供一个(最好是小的)脚本不起作用的例子? - Mark J. Bobak
@Mark J. Bobak:请查看以上的更新 - rapt
我也曾经为此苦恼,因为我不需要 PL SQL 的特殊功能,只需要一些查询集,并使用 Spring 框架的 JdbcTemplate 中的 batchUpdate 方法。它似乎可以像 DBeaver SQL 客户端一样运行。 - Lukasz
2个回答

26

删除空行。在sqlplus中,一个空行意味着停止上一个语句并开始一个新的语句。

或者您可以设置空白行:

set sqlbl on

3
+1,我知道空行的问题,但不知道配置设置。 - user330315
3
哈利路亚!你救了我的一天!你说得非常准确。非常感谢你! - rapt

1

或者您可以在sqldeveloper中使用“Ctrl F7”来格式化您的脚本。我曾经遇到过类似的问题,尝试删除空格等,但显然我漏掉了某些东西。发现了Ctrl F7功能后,脚本就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接