DBMS_OUTPUT.PUT_LINE не печатает

93

При выполнении следующего кода он просто сообщает, что процедура завершена, и не выводит информацию, которую я хочу (firstName, lastName), а затем другие значения из запроса выбора в таблице ниже.

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

При настройке вывода на сервер я получаю

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

много раз!

декстер
источник

Ответы:

193

Что означает «это» в заявлении «он просто говорит, что процедура завершена»?

По умолчанию большинство инструментов не настраивают буфер для dbms_outputзаписи и не пытаются читать из этого буфера после выполнения кода. С другой стороны, у большинства инструментов есть такая возможность. В SQL * Plus вам нужно будет использовать команду set serveroutput on [size N|unlimited]. Итак, вы бы сделали что-то вроде

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

В SQL Developer вам нужно перейти в View | DBMS Outputокно, чтобы включить окно вывода СУБД, а затем нажать на зеленый значок плюса, чтобы включить вывод СУБД для определенного сеанса.

Кроме того, предполагая, что вы не хотите печатать литерал «a.firstNamea.lastName» для каждой строки, вы, вероятно, захотите

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Джастин Кейв
источник
К сожалению, при выполнении вышеуказанной процедуры появляется сообщение об успешном завершении процедуры PL / SQL. Я использую SQL plus
Декстер
8
@dexter - ОК. Тогда вам просто нужно добавить set serveroutput onкоманду перед выполнением процедуры в SQL * Plus.
Джастин Кейв,
@dexter - Верно. См. Мой комментарий в конце - если вам не нужен этот литерал для каждой строки, вам, вероятно, понадобится синтаксис, который я опубликовал в конце моего ответа.
Джастин Кейв,
Хорошо, теперь он отображает правильные имена, но примерно 100 раз. как мне отобразить заголовок, год, имя роли, цитату в таблице ниже вместо сотен отображаемых имен
Декстер
1
@dexter - извини, я не понимаю. Вы говорите, что вы набрали SELECTоператор в командной строке SQL Plus, оператор SQL был выполнен, данные были возвращены, но данные не были отображены в SQL Plus? Это кажется маловероятным, если вы не играли с autotraceнастройками, и в этом случае вы могли видеть план запроса и статистику выполнения, а не результаты запроса. Однако мы начинаем довольно далеко уходить от вашего первоначального вопроса.
Джастин Кейв,
21
  1. Убедитесь, что окно вывода Dbms открыто с помощью параметра просмотра в строке меню.
  2. Щелкните зеленый знак «+» и добавьте имя своей базы данных.
  3. Напишите DBMS_OUTPUT.ENABLE; внутри вашей процедуры в качестве первой строки. Надеюсь, это решит вашу проблему.
Атул Патель
источник
Для какого приложения предназначены эти инструкции?
osullic,
14

это утверждение

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

означает напечатать строку как есть ... удалите кавычки, чтобы значения были напечатаны. Итак, правильный синтаксис

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
Асура
источник
14

Задайте запрос, как показано ниже, в первой строке

SET SERVEROUTPUT ON 
Sreenath S
источник
даже это не работает .. Пожалуйста, предоставьте любую другую альтернативу
Лова Читтумури
Просто чтобы быть предельно ясным. Строка, предложенная Sreenath S, идет первой и выходит за пределы всех блоков кода, таких как DECLARE и BEGIN / END. Сначала я попытался сделать это в своем блоке DECLARE, который не работает. Я использую SQL * Plus.
Грант Джонсон,
2

Я использую Oracle SQL Developer,

В этом инструменте мне пришлось включить вывод СУБД, чтобы просматривать результаты, напечатанные dbms_output.put_line

Вы можете найти этот параметр в панели результатов, где отображаются другие результаты запроса. Итак, в панели результатов у меня есть 7 вкладок. 1-я вкладка называется «Результаты», следующая - «Вывод сценария» и так далее. Из этого вы можете найти вкладку с именем «Вывод СУБД», выберите эту вкладку, затем первый значок (выглядит как значок диалога) - Включить вывод СУБД . Щелкните этот значок. Затем вы выполняете PL / SQL, затем выбираете вкладку «Вывод СУБД», вы должны увидеть там результаты.

Джон Prawyn
источник
0

Все они концентрируются на цикле for, но если мы используем обычный цикл, то нам пришлось бы использовать переменную записи курсора. Ниже приведен модифицированный код

 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
источник