2010-05-11 34 views
8

Tengo un problema al intentar ejecutar mi script sql en Oracle utilizando sqlplus. El guión simplemente rellena algunos datos ficticios:Problema al ejecutar el script oracle desde la línea de comando usando 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; 
/

Mi script funciona bien cuando lo ejecuto utilizando Oracle SQL Developer pero cuando se utiliza la herramienta de línea de comandos sqlplus esto es lo que da salida y luego se cuelga:

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 

estoy ejecutando la herramienta utilizando esta línea de comandos, que funciona bien para otras secuencias de comandos:

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

¿Alguna idea? Gracias.

+0

¿Qué sucede cuando se conecta a su base de datos a través de sqlplus y luego, cuando se le solicita, se llama al script? – akf

+0

Simplemente se cuelga allí. – Charlie

Respuesta

14

Necesitas o bien poner un exit al final de la secuencia de comandos, o ejecutarlo como sqlplus username/[email protected]/dbname < Setup.sql (es decir redirigidos de entrada, en lugar de <@). Puede verificar si ese es el problema simplemente escribiendo 'salir' en la sesión de suspensión.

Si realmente está colgando, ¿ha confirmado o revertido la ejecución del desarrollador?

+0

incluso sin la 'salida', debería hacer * algo *, es decir, completar y mostrar un aviso. – akf

+0

cierto, normalmente estoy ejecutando '-s' cuando cometo este error –

+1

Sí, lo siento, es la transacción no comprometida. ¡La primera vez que utilicé Oracle o alguna de estas herramientas! – Charlie

13

Estaba viendo este problema también con ciertas secuencias de comandos que se ejecutarían bien en un cliente como TOAD, pero cuando se ejecutan a través de SQLPlus con la directiva @script en lugar de colgar, el cliente SQLPlus devolverá un mensaje con un número lo que corresponde al número de líneas en el script que se está ejecutando (+1).

Por ejemplo, si ejecutamos un script llamado 'doit.sql' que tenía 70 líneas comenzaríamos SQLPlus con el comando apropiado e introduzca:

> @doit.sql

Entonces veríamos:

71:

de presionar eNTER en este punto sería volver

72:

Pudimos obtener estos scripts ejecutados al ingresar / en el prompt y presionar enter.

+0

. Tenía una secuencia similar, colgando con solo un número que podía incrementar presionando Intro. Redirigí mi script a mi comando SQLPlus, usando '<' en lugar de '@' y el script finalizó y regresó al símbolo del sistema, según la sugerencia en [@ alex-poole's post] (http://stackoverflow.com/ a/2809504/304330), arriba. Desafortunadamente, no podía simplemente agregar 'EXIT', ya que mi importación dio lugar a una serie de scripts de terceros, compartidos en todo el negocio en nuestro repositorio de códigos. –

0

En lugar de usar el / en el aviso, asegúrese de que su consulta en el doit.sql finalice con un punto y coma.

+0

Esto debería haber sido un comentario a la respuesta de cwash, pero está mal de todos modos; obtener las indicaciones del número de línea indica que era un bloque PL/SQL, que requeriría el '/' (así como el ';', que ya debe estar allí o aún no funcionaría). –

5

La respuesta simple

Asegúrese de poner tanto 'fin'; y en la línea final ponga '/'

Se ejecutará con facilidad.

+0

lo arregló para mí. – Yoav24

0

La línea de comandos

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

mencionado anteriormente significa que sqlplus debe ejecutar el script Setup.sql y esperar nuevas órdenes interactivamente (si la escritura no hace exit explícitamente). Este es un comportamiento normal de sqlplus.

sqlplus termina en tres casos:

  • fallo (. Para algunos errores puede cambiar si termina o no Ver WHENEVER plsql mando)
  • explícita exit (ambos interactivo y sript)
  • Fin de STDIN (EOF)

Ya sea desde el modo interactivo o desde una secuencia de comandos, puede enviar ^Z caracteres r para finalizar suavemente el flujo de entrada. Interactivamente, solo presiona Ctrl+Z,Enter.

Y, por supuesto, puede redireccionar STDIN, y tomarlo del archivo, no del teclado. Hay dos formas similares de hacer esto:

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

En ambos casos sqlplus terminarán después de la ejecución del script debido EOF en el flujo de entrada.

Cuestiones relacionadas