2012-05-03 3 views
51

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

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 

несколько раз!

ответ

115

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

По умолчанию большинство инструментов не конфигурируют буфер для 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 для того, чтобы окно вывода СУБД, а затем нажмите на зеленый значок плюса, чтобы включить DBMS выход для конкретного сеанса.

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

FOR row IN quote_recs 
LOOP 
    DBMS_OUTPUT.PUT_LINE(row.firstName || ' ' || row.lastName); 
END LOOP; 
+0

К сожалению, при выполнении процедуры, указанной выше, процедура PL/SQL успешно завершена. Я использую SQL plus – dexter

+6

@dexter - ОК. Затем вам нужно добавить команду 'set serveroutput on' перед выполнением процедуры в SQL * Plus. –

+0

см. Мое редактирование – dexter

12

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

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

означает напечатать строку, как это .. удалить Кавычки, чтобы получить значения для printed.So правильного синтаксиса

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

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

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; 
    /
10
  1. Убедитесь, что у вас есть окно Output DBMS открыть с помощью опции просмотра в меню.
  2. Нажмите на зеленый знак «+» и добавьте имя своей базы данных.
  3. Напишите 'DBMS_OUTPUT.ENABLE;' в вашей процедуре в качестве первой строки. Надеюсь, это решает вашу проблему.
+0

Мне не нужно было делать шаг 3. Также спасибо @Atul и @Usman! –

Смежные вопросы