我试图使用游标将表table_name
中的所有记录加载到某些集合中,但完全无法正常工作。当我试图显示某些值时,我使用不正确的参数或带有该dbms_output.put_line()
的不正确的数字出错。
表table_name
的各列仅包含Intiger,并且始终具有id
列和x_1 ... x_10列,并具有10行。我只是不想输入x_1,x_2,x_3,x_4等。
我在做什么错了?
DECLARE
cursor c_Table is
select * from table_name;
type x_values is table of game%rowtype;
x_values_list x_values := x_values();
square int := 0;
id_from_table int := 0;
temp int := 0;
BEGIN
select Max(id) into square from table_name;
x_values_list.extend(square*square+square);
/*open table_game;
fetch table_game bulk collect
into x_values_list;
*/
select * bulk collect into x_values_list
from game;
for i in 1..square loop
dbms_output.put_line(x_values_list(i)|| ' ');
end loop;
END;
答案 0 :(得分:4)
不幸的是,您必须键入x_1
,x_2
等。您目前正在尝试将记录类型传递到put_line()
和that procedure only accepts a string value。
您显示的代码将获得:
PLS-00306:调用'||'时参数的数量或类型错误
因为您正尝试将记录类型与字符串连接;没有|| ' '
部分,您将得到:
PLS-00306:“ PUT_LINE”调用中参数的数量或类型错误
没有一种机制可以将记录的字段神奇地转换为单个字符串,您必须自己做。
因此,您必须这样做:
for i in 1..x_values_list.count loop
dbms_output.put_line(x_values_list(i).id
|| ' ' x_values_list(i).x_1
|| ' ' x_values_list(i).x_2
|| ' ' x_values_list(i).x_3
-- etc. for all the fields you want to display
);
end loop;
您可以使用dbms_sql
来查询查询结果元数据(as shown here),但是这样做并不值得。
正如@hotfix在评论中提到的,过程的前两行:
select Max(id) into square from table_name;
x_values_list.extend(square*square+square);
毫无意义; bulk collect
将完全替换集合的内容,您无需事先调整大小(扩展)。那不会给您带来问题,只是不需要。
在上面的循环中,我将1..square
更改为1..x_values_list.count
,所以它是基于批量获取后的实际集合大小;因此您根本不需要square
局部变量。