我只是在学习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;
答案 0 :(得分:3)
你不能只是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
语法会为您处理一些事情:
区别仅在于语法。两者的实际执行和表现几乎相同。
答案 1 :(得分:2)
请记住您的PLSQL正在服务器上运行; dbms_output不会将文本写入您的屏幕,它会将其转储到服务器上的一个表中,客户端知道它应该在返回控件后查看。只需一个选择就可以将数据拉回来,无处可放(概念上),因此编译器会抱怨。
通常你会想要对数据做些什么 - 将它存储在某个地方,迭代它,用它来更新别的东西等等。
e.g:
---
for i in (select * from student)
loop
dbms_output.put_line(i.name);
end loop;
---