我有一个查询,这个查询是在两个表之间连接的,这些表有很多列,有些列有相同的名称,当我在SQL窗口中单独运行查询时,工作正常,没有任何错误,但当我把它放在游标中时,我得到了错误:PLS-00404:游标列表,以避免重复列请求的别名
我知道我应该给这些列赋予alise,但为什么它在SQL窗口中有效,而在光标中不起作用,除了赋予alise之外,还有什么方法可以避免这个错误吗。
我的脚本是使用utl_file:将数据导出到excel
declare
file_handle UTL_FILE.file_type;
vdir varchar2(255);
vfile varchar2(255);
V_CLOB CLOB;
begin
vdir := 'TEST1';
vfile := '1.xls';
file_handle := utl_file.fopen(vdir, vfile,'W');
utl_file.put_line(file_handle, 'xxxx xxxx' || chr(9) || '');
for rr in (
select t.*, t.Rowid , VAC.*
FROM TH1 T,
(SELECT V.* FROM vac_history v WHERE V.ID IN ( SELECT MAX(VH.ID) FROM VAC_HISTORY VH GROUP BY VH.TH_ID1)) VAC
WHERE t.id1 = VACH.th_id1(+)
ORDER BY t.Name
)loop
begin
utl_file.put_line(file_handle, rr.xxxx|| chr(9) || '');
exception
when others then
dbms_output.put_line('Error: ' ||SQLERRM(sqlcode)||
'at line: ' || $$plsql_line);
end;
end loop;
utl_file.fclose(file_handle);
end;
查询:
select t.*, t.Rowid, VAC.*
FROM TH1 T,
(SELECT V.* FROM vac_history v WHERE V.ID IN ( SELECT MAX(VH.ID) FROM VAC_HISTORY VH GROUP BY VH.TH_ID1)) VAC
WHERE t.id1 = VACH.th_id1(+)
ORDER BY t.Name
这是因为当你有一个像这样使用的游标时,在游标r中使用rr.x这样的语法来引用列。因此,如果没有别名,pl/sql就无法判断你引用的是哪一列。当你在sqlplus或sqldev这样的任何工具中运行sql时,该工具将检索类似数组结构中的行,并按该结构中的顺序打印它们。某些工具会在列名后添加后缀。