Ошибка компиляции при создании элементарной процедуры plsql - PullRequest
0 голосов
/ 06 октября 2011

Я только изучаю plsql, и у меня возникают проблемы при выполнении простых SQL-запросов в процедурах.Я хотел написать процедуру, которая отображает все записи из таблицы.

create or replace procedure display_all_students
as
    begin
        dbms_output.put_line('Listing all the student records');
        select * from student;
    end;

Я получаю это в результате: Предупреждение: Процедура создана с ошибками компиляции.

Чего мне не хватает,из того, что я понимаю, это то, что plsql является расширением для sql. Есть ли какой-то другой способ добиться этого вместо этого?

Обновленный код, я все еще сталкиваюсь с той же проблемой.Есть ли способ, с помощью которого мы можем отладить эти ошибки одну за другой?

-- procedure to display the table
create or replace procedure display_all_students
as
  -- declarations
  cursor cur_student is
    select * from student;
  student_record student%rowtype;
 begin
    dbms_output.put_line('Listing all the student records');
    for student_record in cur_student
    loop
      dbms_output.put_line(student_record);
    end loop;
  end;

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Вы не можете просто select * from student;.Это ничего не значит, что это делает с возвращенными данными?

Вместо этого вам нужно либо создать курсор, который selects ... from student или SELECT columns INTO variables FROM student;.

Так что для вас проблеманужно создать курсор, который выбирает из студента, а затем перебрать его и вывести каждую строку.Например:

create or replace procedure display_all_students
as
    CURSOR cur_student IS
    SELECT student_id, first_name, last_name FROM student;    
begin
    dbms_output.put_line('Listing all the student records');
    FOR rec IN cur_student
    LOOP
        dbms_output.put_line( 'ID[' || rec.student_id || '] Name: '
            || rec.first_name || ' ' rec.last_name);
    END LOOP;
end;

То же самое, что написано на длинном пути, вероятно, лучше изучать как начинающему, так как оно учит вас различным аспектам курсоров и т. Д. Это тот же самый код, написанный на длинном пути.

create or replace procedure display_all_students
as
    CURSOR cur_student IS
    SELECT student_id, first_name, last_name FROM student;    
    -- Host Variable to store cursor result.
    rec cur_student%ROWTYPE;
begin
    dbms_output.put_line('Listing all the student records');
    OPEN cur_student;
    LOOP
        FETCH cur_student INTO rec;
        EXIT WHEN cur_student%NOTFOUND;
        dbms_output.put_line( 'ID[' || rec.student_id || '] Name: '
            || rec.first_name || ' ' rec.last_name);
    END LOOP;
    CLOSE cur_student;
end;

Синтаксис FOR variable IN cursor позаботится о некоторых вещах для вас:

  • Вам не нужно декальцировать переменную хоста
  • У вас нетОТКРЫТЬ курсор
  • Вам не нужно проверять, когда вы достигли конца данных
  • Вам не нужно ЗАКРЫТЬ курсор

Разница только в синтаксисе.Фактическое исполнение и производительность обоих практически идентичны.

2 голосов
/ 06 октября 2011

Имейте в виду, что ваш PLSQL работает на сервере;dbms_output не записывает текст на ваш экран, он выгружает его в таблицу на сервере, которую ваш клиент знает, на что он должен смотреть после возвращения контроля.Один только выбор сам по себе возвращает данные и некуда их поместить (концептуально), и поэтому компилятор жалуется.

Обычно вы хотите что-то делать с данными - хранить их где-то, перебирать,используйте его для обновления чего-либо еще и т. д.

например:

---
for i in (select * from student)
loop
   dbms_output.put_line(i.name);
end loop;
---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...