创建基本plsql过程时的编译错误

时间:2011-10-06 14:52:21

标签: oracle plsql oracle10g

我只是在学习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 个答案:

答案 0 :(得分:3)

你不能只是select * from student;。这并不意味着什么,它对返回的数据有什么作用?

相反,您需要创建一个selects ... from studentSELECT 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语法会为您处理一些事情:

  • 您不必对主变量进行十分转换
  • 您不必打开光标
  • 您无需检查何时到达数据末尾
  • 您不必关闭光标

区别仅在于语法。两者的实际执行和表现几乎相同。

答案 1 :(得分:2)

请记住您的PLSQL正在服务器上运行; dbms_output不会将文本写入您的屏幕,它会将其转储到服务器上的一个表中,客户端知道它应该在返回控件后查看。只需一个选择就可以将数据拉回来,无处可放(概念上),因此编译器会抱怨。

通常你会想要对数据做些什么 - 将它存储在某个地方,迭代它,用它来更新别的东西等等。

e.g:

---
for i in (select * from student)
loop
   dbms_output.put_line(i.name);
end loop;
---