DBMS_OUTPUT.PUT_LINE no imprime

93

Al ejecutar el siguiente código, solo dice que el procedimiento se completó y no imprime la información que quiero (nombre, apellido) y luego los otros valores de la consulta de selección en una tabla a continuación.

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
 AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
 a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');

end loop;
END PRINT_ACTOR_QUOTES;
/ 

Al configurar la salida del servidor, obtengo

a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName

¡varias veces!

diestro
fuente

Respuestas:

191

¿Qué es "eso" en la declaración "simplemente dice que el procedimiento está completo"?

De forma predeterminada, la mayoría de las herramientas no configuran un búfer para dbms_outputescribir y no intentan leer desde ese búfer después de que se ejecuta el código. La mayoría de las herramientas, por otro lado, tienen la capacidad para hacerlo. En SQL * Plus, necesitaría usar el comando set serveroutput on [size N|unlimited]. Entonces harías algo como

SQL> set serveroutput on size 30000;
SQL> exec print_actor_quotes( <<some value>> );

En SQL Developer, iría a View | DBMS Outputpara habilitar la ventana DBMS Output, luego presionaría el ícono verde más para habilitar DBMS Output para una sesión en particular.

Además, suponiendo que no desea imprimir el literal "a.firstNamea.lastName" para cada fila, probablemente desee

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Justin Cave
fuente
Lo sentimos, al ejecutar el procedimiento anterior, el mensaje es procedimiento PL / SQL completado con éxito. Estoy usando SQL plus
dexter
8
@dexter - OK. Luego, solo necesita agregar el set serveroutput oncomando antes de ejecutar el procedimiento en SQL * Plus.
Justin Cave
@dexter - Correcto. Vea mi comentario al final: si no quiere ese literal para cada fila, probablemente querrá la sintaxis que publiqué al final de mi respuesta.
Justin Cave
Ok, ahora muestra los nombres correctos pero como 100 veces. ¿Cómo mostraría el título, el año, el nombre del rol, la cita en una tabla a continuación en lugar de los 100 del nombre que aparece?
dexter
1
@dexter - Lo siento, no entiendo. ¿Está diciendo que escribió la SELECTdeclaración en el símbolo del sistema de SQL Plus, la declaración de SQL se ejecutó, se devolvieron los datos, pero los datos no se mostraron en SQL Plus? Eso parece poco probable a menos que esté jugando con la autotraceconfiguración, en cuyo caso es posible que haya visto un plan de consulta y estadísticas de ejecución en lugar de los resultados de la consulta. Sin embargo, estamos empezando a alejarnos bastante de tu pregunta original.
Justin Cave
21
  1. Asegúrese de tener la ventana de salida de Dbms abierta a través de la opción de vista en la barra de menú.
  2. Haga clic en el signo '+' verde y agregue el nombre de su base de datos.
  3. Escriba 'DBMS_OUTPUT.ENABLE;' dentro de su procedimiento como primera línea. Espero que esto resuelva tu problema.
Atul Patel
fuente
¿Para qué aplicación están destinadas estas instrucciones?
osullic
14

esta declaración

DBMS_OUTPUT.PUT_LINE ('a.firstName' || 'a.lastName');

significa imprimir la cadena tal como está ... eliminar las comillas para obtener los valores que se van a imprimir, por lo que la sintaxis correcta es

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
asura
fuente
13

Establezca la consulta como se muestra a continuación en la primera línea

SET SERVEROUTPUT ON 
Sreenath S
fuente
incluso no funciona ... Por favor, proporcione cualquier otra alternativa
Lova Chittumuri
Solo para ser más claro. La línea que Sreenath S ha sugerido va primero y está fuera de todos los bloques de código como DECLARE y BEGIN / END. Intenté hacerlo primero en mi bloque DECLARE, que no funciona. Estoy usando SQL * Plus.
Grant Johnson
2

Estoy usando Oracle SQL Developer,

En esta herramienta, tuve que habilitar la salida DBMS para ver los resultados impresos por dbms_output.put_line

Puede encontrar esta opción en el panel de resultados donde se muestran otros resultados de la consulta. entonces, en el panel de resultados, tengo 7 pestañas. Primera pestaña denominada Resultados, la siguiente es Salida de script y así sucesivamente. Fuera de esto, puede encontrar una pestaña llamada "Salida DBMS", seleccione esta pestaña, luego el primer icono (parece un icono de diálogo) es Activar salida DBMS . Haga clic en este icono. Luego ejecutas el PL / SQL, luego seleccionas la pestaña "Salida DBMS", deberías poder ver los resultados allí.

John Prawyn
fuente
0

Todos ellos se concentran en el bucle for, pero si usamos un bucle normal, entonces tenemos que usar la variable de registro del cursor. El siguiente es el código modificado

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
    AS
    CURSOR quote_recs IS
    SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
    rolequote rq, actor a, movie m
    where
    rq.quoteID = q.quoteID
    AND
    rq.roleID = r.roleID
     AND
    r.actorID = a.actorID
    AND
    r.movieID = m.movieID
    AND
     a.actorID = id_actor;
    recd quote_recs%rowtype;
    BEGIN
    open quote_recs;
    LOOP
    fetch quote_recs into recs;
    exit when quote_recs%notfound;
    DBMS_OUTPUT.PUT_LINE(recd.firstName||recd.lastName);
    end loop;
    close quote_recs;
    END PRINT_ACTOR_QUOTES;
    / 
Smart003
fuente