2010-05-11 143 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之後將終止。