代码之家  ›  专栏  ›  技术社区  ›  Charlie Gevious

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

  •  8
  • Charlie Gevious  · 技术社区  · 14 年前

    尝试使用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 回复  |  直到 6 年前
        1
  •  14
  •   Alex Poole    14 年前

    你要么把 exit 在脚本的末尾,或以 sqlplus username/password@server/dbname < Setup.sql (即重定向输入, < 而不是 @ )您可以通过在挂起会话中键入“exit”来检查这是否是问题所在。

    如果它真的挂起了,那么您是否提交或回滚了开发人员的执行?

        2
  •  13
  •   Keithius    11 年前

    我在toad等客户机中也看到了这个问题,但是当使用@script指令而不是挂起通过sqlplus执行时,sqlplus客户机将返回一个提示,上面有一个与正在执行的脚本中的行数相对应的数字(+1)。

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

    > @doit.sql

    然后我们会看到:

    71:

    此时按回车键将返回

    72:

    我们可以通过输入 / 出现提示并按Enter键。

        3
  •  5
  •   Viren    11 年前

    简单的答案

    确保将“end;”和“in final line”放在最后一行

    它会很容易地运行。

        4
  •  1
  •   Naeel Maqsudov    7 年前

    命令行

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

    上面提到的意思是 sqlplus 应该执行脚本 Setup.sql 并交互地等待进一步的命令(如果脚本不执行 exit 明确地)。这是一种正常的行为 SqlPlus .

    SqlPlus 三种情况下终止:

    • 失败(对于某些错误,如果它终止或不终止,您可以更改它。见 WHENEVER PLSQL命令
    • 明确的 出口 (交互式和SRIPT)
    • 标准输入结束(EOF)

    从交互模式或脚本发送 ^Z 软终止输入流的字符。以互动方式按下 Ctrl+Z,Enter .

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

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

    在两种情况下 SqlPlus 将在脚本执行后终止,原因是 EOF 在输入流中。

        5
  •  0
  •   sandrows    12 年前

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

        6
  •  0
  •   PranavF    6 年前

    问题是因为sqlplus从Oracle客户机主页运行,并且在运行startup upgrade命令时崩溃。

    从非客户机oracle home运行sqlplus,并尝试执行命令,然后按预期工作。 因此,解决方案是从主Oracle Home而不是Oracle客户端Home运行sqlplus。