DBMS_OUTPUT.PUT_LINE no imprime

Al ejecutar el siguiente código, simplemente 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!

preguntado el 03 de mayo de 12 a las 16:05

8 Respuestas

¿Qué es "eso" en la declaración "simplemente dice que el procedimiento se completó"?

De forma predeterminada, la mayoría de las herramientas no configuran un búfer para dbms_output para escribir y no intentar 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 de hacerlo. En SQL*Plus, necesitaría usar el comando set serveroutput on [size N|unlimited]. Así que 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 Output para habilitar la ventana de salida de DBMS, luego presione el ícono verde más para habilitar la salida de DBMS 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;

contestado el 03 de mayo de 12 a las 16:05

Lo sentimos, al ejecutar el procedimiento anterior, el mensaje es que el procedimiento PL/SQL se completó con éxito. Estoy usando SQL plus - diestro

@dexter - Está bien. Entonces solo tienes que agregar el set serveroutput on comando antes de ejecutar el procedimiento en SQL*Plus. - Justin cueva

@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 cueva

@dexter - Lo siento, no entiendo. ¿Estás diciendo que escribiste el SELECT declaración en el SQLMás símbolo del sistema, se ejecutó la instrucción SQL, se devolvieron los datos, pero los datos no se mostraron en SQL¿Más? Eso parece poco probable a menos que estuvieras jugando con autotrace configuració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 su pregunta original. - Justin cueva

Tal vez interesante para alguien: todavía no obtuve el resultado con SQL Developer usando este manual. Después de un tiempo encontré la razón. community.oracle.com/thread/4062562 Hay un error si usa una base de datos antigua (Oracle 10g) con la versión actual de SQL Developer. - david gausmann

  1. Asegúrese de tener abierta la ventana Salida de Dbms 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. Escribe 'DBMS_OUTPUT.ENABLE;' dentro de su procedimiento como la primera línea. Espero que esto resuelva tu problema.

contestado el 23 de mayo de 16 a las 09:05

¿Para qué aplicación están destinadas estas instrucciones? - osullico

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

SET SERVEROUTPUT ON 

Respondido el 03 de Septiembre de 18 a las 12:09

incluso no funciona. 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

esta declaración

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

significa imprimir la cadena tal como está. elimina las comillas para obtener los valores que se imprimirán. Entonces, la sintaxis correcta es

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

Respondido 13 Jul 16, 14:07

Para desarrollador de SQL

Tienes que ejecutarlo manualmente.

SET SERVEROUTPUT ON 

Después de eso, si ejecuta algún procedimiento con DBMS_OUTPUT.PUT_LINE('info'); o directamente

Esto imprimirá la línea

Y por favor no intentes agregar esto

 SET SERVEROUTPUT ON

dentro de la definición de función y procedimiento, no compilará y no funcionará.

Respondido el 31 de diciembre de 20 a las 10:12

Estoy usando Oracle SQL Developer,

En esta herramienta, tuve que habilitar 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. La primera pestaña se llama 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 ícono (parece un ícono de diálogo) es Habilitar salida DBMS. Haga clic en este icono. Luego ejecuta PL/SQL, luego selecciona la pestaña "Salida de DBMS", debería poder ver los resultados allí.

Respondido el 25 de enero de 19 a las 05:01

Todos ellos se concentran en el bucle for, pero si usamos un bucle normal, entonces tuvimos 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;
    / 

Respondido el 02 de Septiembre de 14 a las 08:09

enter image description here

En Oracle SQL Developer, puede seguir paso a paso como se muestra en la siguiente imagen:

Respondido el 03 de enero de 22 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.