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!

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;

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.

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

14

Ustaw zapytanie jak poniżej w pierwszym wierszu

SET SERVEROUTPUT ON 

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.


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;
    / 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.