plsql - imprimir - que hace dbms_output put_line
DBMS_OUTPUT.PUT_LINE no imprime (4)
- Asegúrese de tener abierta la ventana de salida de Dbms a través de la opción de vista en la barra de menú.
- Haga clic en el signo verde ''+'' y agregue el nombre de su base de datos.
- Escribe ''DBMS_OUTPUT.ENABLE;'' dentro de su procedimiento como primera línea. Espero que esto resuelva tu problema.
Al ejecutar el siguiente código, solo dice que el procedimiento se completó y no imprime la información que quiero (firstName, lastName) 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!
¿Qué es "eso" en la declaración "solo dice que el procedimiento está completo"?
Por defecto, la mayoría de las herramientas no configuran un búfer para que dbms_output
escriba y no intente 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]
. 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 Output
View | DBMS Output
para habilitar la ventana Output de DBMS, luego presione 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, es probable que desee
FOR row IN quote_recs
LOOP
DBMS_OUTPUT.PUT_LINE( row.firstName || '' '' || row.lastName );
END LOOP;
Todos ellos se están concentrando 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;
/
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. Así que la sintaxis correcta es
DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);