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.