DBMS_OUTPUT.PUT_LINE não imprime


93

Ao executar o código a seguir, ele apenas diz que o procedimento está concluído e não imprime a informação que eu quero (firstName, lastName) e depois os outros valores da consulta select em uma tabela abaixo.

 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;
/ 

Ao configurar a saída do servidor, recebo

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

várias vezes!

Respostas:


191

O que é "isso" na declaração "apenas diz que o procedimento está concluído"?

Por padrão, a maioria das ferramentas não configura um buffer para dbms_outputgravar e não tenta ler desse buffer após a execução do código. A maioria das ferramentas, por outro lado, tem a capacidade de fazer isso. No SQL * Plus, você precisa usar o comando set serveroutput on [size N|unlimited]. Então você faria algo como

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

No SQL Developer, você acessaria View | DBMS Outputpara habilitar a janela de Saída de DBMS e pressionaria o ícone de mais verde para habilitar a Saída de DBMS para uma sessão específica.

Além disso, supondo que você não deseja imprimir o literal "a.firstNamea.lastName" para cada linha, você provavelmente deseja

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;

Desculpe, ao executar o procedimento acima a mensagem é procedimento PL / SQL concluído com sucesso. Estou usando o SQL plus
dexter

8
@dexter - OK. Então você só precisa adicionar o set serveroutput oncomando antes de executar o procedimento no SQL * Plus.
Justin Cave

@dexter - Certo. Veja meu comentário no final - se você não quiser esse literal para cada linha, provavelmente vai querer a sintaxe que postei no final da minha resposta.
Justin Cave

Ok, agora ele exibe os nomes corretos, mas como 100 vezes. como eu exibiria título, ano, nome da função e citação em uma tabela abaixo em vez dos 100s do nome que aparece
dexter

@dexter - Se você está afirmando que cada nome é repetido centenas de vezes, e não é isso que você esperava, isso implica que sua SELECTdeclaração está incorreta e provavelmente não possui uma condição de junção. Você deseja refinar sua consulta (que pode ser executada separadamente sem o procedimento) até que a consulta retorne os dados esperados.
Caverna Justin de

21
  1. Certifique-se de que sua janela de saída Dbms esteja aberta através da opção de visualização no menu.
  2. Clique no sinal verde '+' e adicione o nome do seu banco de dados.
  3. Escreva 'DBMS_OUTPUT.ENABLE;' dentro de seu procedimento como a primeira linha. Espero que isso resolva seu problema.

14

esta afirmação

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

significa imprimir a string como está .. remova as aspas para obter os valores a serem impressos. Portanto, a sintaxe correta é

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

13

Defina a consulta como abaixo na primeira linha

SET SERVEROUTPUT ON 

mesmo não funcionando .. Por favor, forneça qualquer outra alternativa
Lova Chittumuri

Só para ser mais claro. A linha que Sreenath S sugeriu vai primeiro e está fora de todos os blocos de código, como DECLARE e BEGIN / END. Tentei fazê-lo primeiro no meu bloco DECLARE, mas não funcionou. Estou usando o SQL * Plus.
Grant Johnson

1

Estou usando o Oracle SQL Developer,

Nesta ferramenta, tive que habilitar a saída do DBMS para visualizar os resultados impressos por dbms_output.put_line

Você pode encontrar esta opção no painel de resultados, onde outros resultados da consulta são exibidos. então, no painel de resultados, tenho 7 guias. 1ª guia nomeada como Resultados, a próxima é Saída do script e assim por diante. Fora disso, você pode encontrar uma guia chamada "Saída DBMS" selecione esta guia, então o primeiro ícone (parece um ícone de diálogo) é Habilitar Saída DBMS . Clique neste ícone. Em seguida, você executa o PL / SQL e, a seguir, seleciona a guia "Saída do DBMS, você deve poder ver os resultados lá.


0

Todos eles estão concentrados no loop for, mas se usarmos um loop normal, teremos que usar a variável de registro do cursor. A seguir está o 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;
    / 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.