- 论坛徽章:
- 0
|
今天碰到一个问题,现象如下:
在一个PC中声明以下CURSOR定义:
SELECT lsh,wjm,scrq,zjs,jls,yhmc,jfykzbs,jfykjehj
from STI_COLL_TTL
where scrq = :pCond->;m_cprq and
substr(wjm,1,1) = :pCond->;m_yhdm and
:pCond->;m_opcode in ('3','4')
union all
select lsh,wjm,to_char(scrq,'yyyymmdd') scrq,zrs * 107 + 98 zjs,zrs jls,' ' yhmc,zrs jfykzbs,to_number(ffze)/100 jfykjehj
from sti_sup_pay_head
where to_char(scrq,'yyyymmdd') = :pCond->;m_cprq and
substr(wjm,1,1) = :pCond->;m_yhdm and
:pCond->;m_opcode = '5'
union all
SELECT lsh,wjm,scrq,zrs * 103 + 58 zjs,zrs jls,yhmc ,zrs jfykzbs,zje jfykjehj
from sti_payout_ttl
where scrq = :pCond->;m_cprq and
substr(wjm,1,1) = :pCond->;m_yhdm and
:pCond->;m_opcode ='6'
order by scrq asc;
PC程序编译通过,但在调用的时候报ORA-00904: invalid column name,如果把上述三个SQL去掉一个SQL语句,改成任意两两UNION ALL,编译和运行均正常。
写一个匿名块在PL/SQL中执行上述语句:
DECLARE
CURSOR C1
IS
SELECT lsh,wjm,scrq,zjs,jls,yhmc,jfykzbs,jfykjehj
from STI_COLL_TTL
where scrq = '20040308' and
substr(wjm,1,1) = 'SDF' and
'3' in ('3','4')
union all
select lsh,wjm,to_char(scrq,'yyyymmdd'),zrs * 107 + 98,zrs,' ',zrs,to_number(ffze)/100
from sti_sup_pay_head
where to_char(scrq,'yyyymmdd') = '20040308' and
substr(wjm,1,1) = 'SDF' and
'5'= '5'
union all
SELECT lsh,wjm,scrq,zrs * 103 + 58,zrs,yhmc ,zrs,zje
from sti_payout_ttl
where scrq = '20040308' and
substr(wjm,1,1) = 'SDF' and
'6' ='6'
order by scrq asc;
BEGIN
NULL;
FOR R1 IN C1 LOOP
NULL;
END LOOP;
END;
/
发现得到和PC中一样的结论,说明和PROC没有任何关系。
目前解决问题的办法有两个,如下:
1。去掉ORDER BY子句;
2。对SQL语句中的表达式和其它列名不一致的统统加上别名。
但是关于这个问题及相关解决办法,ORACLE理论何在???哪位高手知道,请指导指导,谢谢。 |
|