DBMS_OUTPUT.PUT_LINE nie drukuje

93

Podczas wykonywania następującego kodu po prostu mówi, że procedura jest zakończona i nie drukuje informacji, które chcę, aby (firstName, lastName), a następnie innych wartości z zapytania wybierającego w tabeli poniżej.

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

Po włączeniu wyjścia serwera otrzymuję

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

wiele razy!

zręczny
źródło

Odpowiedzi:

193

Co to jest „to” w stwierdzeniu „po prostu mówi, że procedura została zakończona”?

Domyślnie większość narzędzi nie konfiguruje bufora dbms_outputdo zapisu i nie podejmuje próby odczytu z tego bufora po wykonaniu kodu. Z drugiej strony większość narzędzi ma taką możliwość. W SQL * Plus trzeba by użyć polecenia set serveroutput on [size N|unlimited]. Więc zrobiłbyś coś takiego

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

W SQL Developer można przejść do, View | DBMS Outputaby włączyć okno DBMS Output, a następnie nacisnąć zieloną ikonę plusa, aby włączyć wyjście DBMS dla określonej sesji.

Ponadto zakładając, że nie chcesz drukować literału „a.firstNamea.lastName” w każdym wierszu, prawdopodobnie chcesz

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Justin Cave
źródło
Przepraszamy, podczas wykonywania powyższej procedury komunikat to procedura PL / SQL zakończona pomyślnie. Używam SQL plus
dexter
8
@dexter - OK. Następnie wystarczy dodać set serveroutput onpolecenie przed wykonaniem procedury w SQL * Plus.
Justin Cave
@dexter - Racja. Zobacz mój komentarz na końcu - jeśli nie chcesz tego dosłownego dla każdego wiersza, prawdopodobnie będziesz potrzebować składni, którą zamieściłem na końcu mojej odpowiedzi.
Justin Cave
Ok, więc teraz wyświetla prawidłowe nazwy, ale jak 100 razy. jak wyświetlić tytuł, rok, nazwę roli, cytat w tabeli poniżej zamiast setek nazw, które się pojawiają
dexter
1
@dexter - przepraszam, nie rozumiem. Czy twierdzisz, że wpisałeś SELECTinstrukcję w wierszu polecenia SQL Plus, instrukcja SQL została wykonana, dane zostały zwrócone, ale dane nie zostały wyświetlone w SQL Plus? Wydaje się to mało prawdopodobne, chyba że bawiłeś się autotraceustawieniami, w którym to przypadku mógłbyś zobaczyć plan zapytań i statystyki wykonania, a nie wyniki zapytania. Zaczynamy jednak oddalać się od twojego pierwotnego pytania.
Justin Cave
21
  1. Upewnij się, że masz otwarte okno Dbms Output za pomocą opcji widoku na pasku menu.
  2. Kliknij zielony znak „+” i dodaj nazwę bazy danych.
  3. Napisz „DBMS_OUTPUT.ENABLE;” w ramach procedury jako pierwsza linia. Mam nadzieję, że to rozwiązuje twój problem.
Atul Patel
źródło
Do jakiej aplikacji są przeznaczone te instrukcje?
osullic
14

to oświadczenie

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

oznacza wydrukowanie ciągu tak, jak jest. usuń cudzysłowy, aby uzyskać wartości Więc prawidłowa składnia to

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
asura
źródło
14

Ustaw zapytanie jak poniżej w pierwszym wierszu

SET SERVEROUTPUT ON 
Sreenath S
źródło
nawet to nie działa. Proszę podać inną alternatywę
Lova Chittumuri
Żeby było wyjątkowo jasne. Linia, którą zasugerował Sreenath S, idzie jako pierwsza i znajduje się poza wszystkimi blokami kodu, takimi jak DECLARE i BEGIN / END. Próbowałem zrobić to najpierw w moim bloku DECLARE, który nie działa. Używam SQL * Plus.
Grant Johnson
2

Używam Oracle SQL Developer,

W tym narzędziu musiałem włączyć wyjście DBMS, aby wyświetlić wyniki wydrukowane przez dbms_output.put_line

Tę opcję można znaleźć w okienku wyników, w którym wyświetlane są inne wyniki zapytania. więc w panelu wyników mam 7 zakładek. Pierwsza zakładka o nazwie Wyniki, następna to Wyjście skryptu i tak dalej. Z tego możesz znaleźć zakładkę o nazwie „Wyjście DBMS” wybierz tę zakładkę, a następnie pierwsza ikona (wygląda jak ikona dialogowa) to Włącz wyjście DBMS . Kliknij tę ikonę. Następnie wykonujesz PL / SQL, a następnie wybierasz zakładkę "DBMS Output", powinieneś być w stanie zobaczyć tam wyniki.

John Prawyn
źródło
0

Wszystkie koncentrują się na pętli for, ale jeśli używamy normalnej pętli, musieliśmy użyć zmiennej rekordu kursora. Poniżej znajduje się zmodyfikowany kod

 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
źródło