使用sqlplus从命令行运行oracle脚本时出现问题

时间:2010-05-11 08:57:49

标签: sql oracle sqlplus

我在尝试使用sqlplus将我的sql脚本运行到oracle时遇到问题。该脚本只填充一些虚拟数据:

DECLARE 
  role1Id NUMBER;
  user1Id NUMBER;
  role2Id NUMBER;
  user2Id NUMBER;
  role3Id NUMBER;
  user3Id NUMBER;
  perm1Id NUMBER;
  perm2Id NUMBER;
  perm3Id NUMBER;
  perm4Id NUMBER;
  perm5Id NUMBER;
BEGIN
  INSERT INTO PB_USER(USER_ID,USER_NAME, USER_EMAIL, USER_ACTIVEYN)
  VALUES(PB_USER_ID_SEQ.nextval, 'RoleDataManagerTests_Username', 'test@test.com',' ');

  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 1');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 2');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 3');

  SELECT ROLE_ID INTO role1Id FROM ROLES WHERE ROLE_NAME = 'Test role 1';
  SELECT USER_ID INTO user1Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user1Id, role1Id);

  SELECT ROLE_ID INTO role2Id FROM ROLES WHERE ROLE_NAME = 'Test role 2';
  SELECT USER_ID INTO user2Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user2Id, role2Id);

  SELECT ROLE_ID INTO role3Id FROM ROLES WHERE ROLE_NAME = 'Test role 3';
  SELECT USER_ID INTO user3Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user3Id, role3Id);

  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm1', 'permission 1');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm2', 'permission 2');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm3', 'permission 3');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm4', 'permission 4');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm5', 'permission 5');

  SELECT PERMISSION_ID INTO perm1Id FROM PERMISSIONS WHERE KEY = 'perm1';
  SELECT PERMISSION_ID INTO perm2Id FROM PERMISSIONS WHERE KEY = 'perm2';
  SELECT PERMISSION_ID INTO perm3Id FROM PERMISSIONS WHERE KEY = 'perm3';
  SELECT PERMISSION_ID INTO perm4Id FROM PERMISSIONS WHERE KEY = 'perm4';
  SELECT PERMISSION_ID INTO perm5Id FROM PERMISSIONS WHERE KEY = 'perm5';

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm1Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm2Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role2Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm4Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm5Id);
END;
/

当我使用Oracle SQL Developer运行它时,我的脚本运行正常,但是当我使用sqlplus命令行工具时,这就是输出的内容,然后它就会挂起:

SQL*Plus: Release 11.1.0.7.0 - Production on Tue May 11 09:49:34 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining Scoring Engine
and Real Application Testing options

我正在使用此命令行运行该工具,该工具适用于其他脚本:

sqlplus username/password@server/dbname @Setup.sql

有什么想法吗?感谢。

6 个答案:

答案 0 :(得分:14)

您需要在脚本末尾添加exit,或者将其作为sqlplus username/password@server/dbname < Setup.sql运行(即重定向输入,<而不是@)。您只需在挂起会话中键入“exit”即可检查是否存在问题。

如果它真的挂起,你是否已经从开发人员提交或回滚执行?

答案 1 :(得分:13)

我也看到了这个问题,某些脚本可以在像TOAD这样的客户端中正常执行,但是当使用@script指令通过SQLPlus执行而不是挂起时,SQLPlus客户端会返回一个带有数字的提示符它对应于正在执行的脚本中的行数(+1)。

例如,如果我们执行了一个名为'doit.sql'的脚本,该脚本有70行,我们将使用适当的命令启动SQLPlus并输入:

> @doit.sql

然后我们会看到:

71:

此时按Enter键将返回

72:

我们能够通过在提示符处输入/并按Enter键来执行这些脚本。

答案 2 :(得分:5)

简单回答

确保你把两个'结束;'并在最后一行放'/'

它会轻松运行。

答案 3 :(得分:1)

命令行

sqlplus username/password@server/dbname @Setup.sql
上面提到的

意味着sqlplus应该执行脚本Setup.sql并以交互方式等待进一步的命令(如果脚本没有明确地执行exit)。这是sqlplus的正常行为。

sqlplus在三种情况下终止:

  • 失败(对于某些错误,如果终止或不终止,您可以更改。请参阅WHENEVER plsql-command)
  • 明确exit(互动和贿赂)
  • STDIN(EOF)结束

无论是从交互模式还是从脚本,您都可以发送^Z字符以轻柔地终止输入流。您只需按Ctrl+Z,Enter

进行互动

当然,您可以重定向STDIN,并从文件中获取,而不是从键盘中获取。有两种类似的方法可以做到这一点:

1) sqlplus username/password@server/dbname<Setup.sql
2) echo @Setup.sql|sqlplus username/password@server/dbname

在这两种情况下,由于输入流中的sqlplusEOF将在脚本执行后终止。

答案 4 :(得分:0)

不要在提示符处使用/,而是确保doit.sql中的查询以分号结尾。

答案 5 :(得分:0)

问题是因为SQLplus从oracle客户端主页运行,并且在运行启动升级命令时崩溃。

从非客户端oracle home运行sqlplus并尝​​试命令然后它按预期工作。 所以决议是从主oracle home而不是oracle client home运行sqlplus。

相关问题