2012-05-03 15 views
51

Al ejecutar el siguiente código, solo dice que el procedimiento está completo y no imprime la información que quiero (firstName, lastName) y luego los otros valores de la consulta de selección en una tabla debajo .DBMS_OUTPUT.PUT_LINE no imprime

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 ajustar la salida del servidor, obtengo

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

varias veces!

Respuesta

115

¿Qué significa "eso" en la frase "simplemente dice que el procedimiento está completo"?

De forma predeterminada, la mayoría de las herramientas no configuran un búfer para dbms_output para escribir 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 de hacerlo. En SQL * Plus, necesitaría usar el comando set serveroutput on [size N|unlimited]. Así que harías algo así como

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

En SQL Developer, que iría a View | DBMS Output para permitir la ventana de salida DBMS, a continuación, empuje el icono más verde para activar la salida de DBMS para una sesión particular.

Además, en el supuesto de 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; 
+0

Lo sentimos, al ejecutar el procedimiento anterior el mensaje es el procedimiento PL/SQL completado con éxito. Estoy usando SQL más – dexter

+6

@dexter - OK. Entonces solo necesita agregar el comando 'set serveroutput on' antes de ejecutar el procedimiento en SQL * Plus. –

+0

por favor vea mi edición – dexter

12

esta declaración

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

significa para imprimir la cadena, ya que es .. quitar las comillas para obtener los valores que se printed.So la sintaxis correcta se

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

Todos ellos están concentrando en el bucle 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; 
    /
10
  1. Asegúrese de que tiene su ventana de salida Dbms abierto 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 primera línea. Espero que esto resuelva su problema.
+0

No tuve que hacer el paso 3. También gracias @Atul y @Usman! –