DBMS_OUTPUT.PUT_LINE не друкується


93

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

 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

кілька разів!

Відповіді:


191

Що означає "це" у заяві "там просто сказано, що процедура завершена"?

За замовчуванням більшість інструментів не налаштовують буфер для 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
dexter

8
@dexter - Добре. Тоді вам просто потрібно додати set serveroutput onкоманду перед виконанням процедури в SQL * Plus.
Джастін Кейв

@dexter - Правильно. Подивіться мій коментар наприкінці - якщо ви не хочете цей літерал для кожного рядка, вам, ймовірно, потрібен синтаксис, який я опублікував наприкінці моєї відповіді.
Джастін Кейв

Гаразд, тепер він відображає правильні імена, але приблизно 100 разів. як би я відображав заголовок, рік, ім'я ролі, цитату в таблиці нижче замість 100-х імен, що з'являються
dexter

1
@dexter - Вибачте, я не розумію. Ви хочете сказати, що ви ввели SELECTоператор у командному рядку SQL Plus, оператор SQL виконано, дані повернуто, але дані не відображалися в SQL Plus? Це здається малоймовірним, якщо ви не грали з autotraceналаштуваннями, і в цьому випадку ви могли бачити план запиту та статистику виконання, а не результати запиту. Однак ми починаємо віддалятися від вашого початкового питання.
Джастін Кейв

21
  1. Переконайтеся, що відкрите вікно виводу Dbms через параметр подання на панелі меню.
  2. Клацніть на зелений знак "+" і додайте ім'я бази даних.
  3. Напишіть 'DBMS_OUTPUT.ENABLE;' у вашій процедурі як перший рядок. Сподіваюся, це вирішить вашу проблему.

Для якої програми призначені ці інструкції?
осулічний

14

це твердження

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

означає надрукувати рядок таким, яким він є. видаліть лапки, щоб отримати значення для друку. Отже, правильний синтаксис

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

13

Встановіть запит, як показано нижче, у першому рядку

SET SERVEROUTPUT ON 

навіть це не працює .. Будь ласка, надайте будь-яку іншу альтернативу
Лова Чіттумурі

Просто для того, щоб бути надто чітким. Рядок, який запропонував Sreenath S, йде першим і знаходиться поза усіма блоками коду, такими як DECLARE та BEGIN / END. Я спробував зробити це спочатку у своєму блоці DECLARE, який не працює. Я використовую SQL * Plus.
Грант Джонсон,

2

Я використовую Oracle SQL Developer,

У цьому інструменті мені довелося включити вивід СУБД для перегляду результатів, надрукованих dbms_output.put_line

Ви можете знайти цю опцію в області результатів, де відображаються інші результати запиту. отже, на панелі результатів у мене 7 вкладок. Перша вкладка з назвою Результати, наступна - Виведення сценарію тощо. Звідси ви можете знайти вкладку з назвою "Вихід СУБД", виберіть цю вкладку, тоді перша піктограма (схожа на піктограму діалогу) - Увімкнути виведення СУБД . Клацніть на цю піктограму. Потім ви виконуєте PL / SQL, потім вибираєте "Вкладка Вивід СУБД, ви повинні бачити там результати.


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;
    / 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.