2010-05-11 14 views
8

Ho riscontrato un problema nel tentativo di eseguire il mio script sql in oracle utilizzando sqlplus. Lo script appena popola alcuni dati dummy:Problema di esecuzione di script oracle da riga di comando utilizzando sqlplus

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; 
/

Il mio script funziona bene quando l'eseguo utilizzando Oracle SQL Developer, ma quando uso lo strumento da riga di comando sqlplus questo è ciò che è emesso e poi si blocca solo:

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 

che sto eseguendo lo strumento utilizzando questa riga di comando, che funziona bene per altri script:

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

Tutte le idee? Grazie.

+0

cosa succede quando ci si connette al db tramite sqlplus, quindi al prompt si chiama lo script? – akf

+0

Si blocca lì. – Charlie

risposta

14

è necessario o porre exit alla fine dello script, o eseguirlo come sqlplus username/[email protected]/dbname < Setup.sql (vale a dire reindirizzato ingresso, < invece di @). Puoi verificare se questo è il problema semplicemente digitando 'exit' nella sessione sospesa.

Se è davvero sospeso, hai commesso o annullato l'esecuzione dallo sviluppatore?

+0

anche senza 'exit', dovrebbe fare * qualcosa *, cioè completare e visualizzare un prompt. – akf

+0

true, di solito sto usando '-s' quando faccio questo errore –

+1

Sì, scusami, è la transazione che non viene commessa. La prima volta che ho usato oracle o qualcuno di questi strumenti! – Charlie

13

Stavo vedendo questo problema anche con alcuni script che si eseguivano bene in un client come TOAD, ma quando veniva eseguito tramite SQLPlus con la direttiva @script invece di appendere, il client SQLPlus restituiva un prompt con un numero su che corrispondeva al numero di righe nello script in esecuzione (+1).

Per esempio, se abbiamo eseguito uno script chiamato 'doit.sql' che aveva 70 linee avremmo iniziato SQLPlus con il comando appropriato e digitare:

> @doit.sql

Poi vorremmo vedere:

71:

premendo Invio a questo punto sarebbe tornare

72:

Siamo stati in grado di ottenere questi script eseguiti inserendo / al prompt e premendo invio.

+0

ho avuto simile, appeso con solo un numero che potrei incrementare premendo invio. Ho reindirizzato il mio script nel mio comando SQLPlus, utilizzando '<' invece di '@' e lo script è terminato e restituito al prompt dei comandi, come da suggerimento in [@ alex-poole's post] (http://stackoverflow.com/ a/2809504/304330), sopra. Sfortunatamente, non potevo semplicemente aggiungere "EXIT", poiché la mia importazione portava a una serie di script di terze parti, condivisi intorno all'azienda nel nostro repository di codice. –

0

Invece di utilizzare / al prompt, assicurarsi che la query nel doit.sql termini con un punto e virgola.

+0

Questo dovrebbe essere un commento alla risposta di cwash, ma è comunque sbagliato; ottenere i prompt del numero di riga indica che si trattava di un blocco PL/SQL, che avrebbe richiesto '/' (così come ';', che deve essere già presente o che comunque non funzionerebbe). –

5

La risposta semplice

assicuratevi di mettere entrambi 'end;' e nella riga finale mettere '/'

Funzionerà con facilità.

+0

risolto per me. – Yoav24

0

La riga di comando

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

di cui sopra significa che sqlplus dovrebbe eseguire lo script Setup.sql e attendere ulteriori comandi in modo interattivo (se lo script non fa exit esplicitamente). Questo è un comportamento normale di sqlplus.

sqlplus termina in tre casi:

  • Failure (. Per alcuni errori si può cambiare se termina o non vedere WHENEVER plsql-comando)
  • esplicita exit (sia interattiva e sript)
  • End of STDIN (EOF)

Dalla modalità interattiva o dallo script è possibile inviare ^Z characte r per terminare dolcemente il flusso di input. In modo interattivo basta premere Ctrl+Z,Enter.

E, naturalmente, è possibile reindirizzare STDIN e prenderlo dal file, non dalla tastiera. Ci sono due modi simili per farlo:

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

In entrambi i casi sqlplus annullano dopo l'esecuzione dello script causa della EOF nel flusso di ingresso.

Problemi correlati