2010-05-11 73 views
8

我在使用sqlplus将我的sql脚本运行到oracle中时遇到问题。该脚本只是填充一些虚拟的数据:使用sqlplus从命令行运行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', '[email protected]',' '); 

    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/[email protected]/dbname @Setup.sql 

任何想法?谢谢。

+0

当你通过sqlplus连接到你的数据库,然后在提示符下调用脚本时会发生什么? – akf 2010-05-11 09:17:36

+0

它只是挂在那里。 – Charlie 2010-05-11 09:21:13

回答

14

你需要要么把一个exit在脚本的末尾,或者运行它sqlplus username/[email protected]/dbname < Setup.sql(即重定向输入的,而不是<@)。只需在挂起的会话中输入'exit'即可检查是否有问题。

如果它真的挂起,你有没有提交或回滚开发者的执行?

+0

即使没有'退出',它应该*做* *,即完成并显示提示。 – akf 2010-05-11 09:37:35

+0

是的,当我犯这个错误时,我通常会用'-s'运行 – 2010-05-11 09:39:11

+1

对不起,我的错,这是没有提交的事务。我第一次使用oracle或任何这些工具! – Charlie 2010-05-11 09:41:47

13

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

例如,如果我们执行了一个名为“doit.sql”是有70行,我们将使用相应的命令启动的SQLPlus并输入脚本:

> @doit.sql

然后我们会看到:

71:

按在这一点上输入将返回

72:

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

+0

我有类似的,悬挂只有一个数字,我可以通过按Enter增加。根据[@ alex-poole's post](http://stackoverflow.com/)中的建议,我使用'<'而不是'@'将脚本重定向到了SQLPlus命令,脚本结束并返回到命令提示符处。 a/2809504/304330)。不幸的是,我不能仅仅添加'EXIT',因为我的导入导致了许多第三方脚本,在我们的代码库中共享业务。 – 2016-12-01 13:31:12

0

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

+0

这应该是cwash的回答的评论,但无论如何都是错误的。获得行号提示表明它是一个PL/SQL块,它需要'/'(以及';',它必须已经在那里或者它仍然不起作用)。 – 2012-07-10 22:05:28

5

简单的答案

确保你把两个“末端”并在最后一行放'/'

它会轻松运行。

+0

为我修好了。 – Yoav24 2018-03-06 19:04:42

0

命令行

sqlplus username/[email protected]/dbname @Setup.sql 
上述

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

sqlplus终止于三种情况:

  • 故障(对于某些错误,如果它终止与否,您可以更改见WHENEVER PLSQL命令)
  • 明确exit(交互式和sript)
  • STDIN结尾(EOF)

无论是从互动模式或从脚本您可以发送^Z characte r柔和地终止输入流量。以交互方式,您只需按Ctrl+Z,Enter即可。

而且,当然,您可能会重定向STDIN,并将其从文件中取出,而不是从键盘中取出。有两个类似的方法可以做到这一点:

1) sqlplus username/[email protected]/dbname<Setup.sql 
2) echo @Setup.sql|sqlplus username/[email protected]/dbname 

在这两种情况下sqlplus输入流脚本执行,因为EOF之后将终止。