我想在oracle中使用decode-in-loop语句,但无法这样做。这是我的问题
for cur1 in
(
select distinct nvl(COVID_RISK_ZONE_NAME, 'No Data') "COVID_RISK_ZONE_NAME" from covid_daily_status
)
loop
VparaText:=VparaText||''''||cur1.COVID_RISK_ZONE_NAME||''' AS ' || '"'|| cur1.COVID_RISK_ZONE_NAME||'",';
VselectText:=VselectText||'x."'||cur1.COVID_RISK_ZONE_NAME||'"'|| ' AS ' || '"'||
decode(cur1.covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , cur1.covid_risk_zone_name)||'",';
end loop;
select SUBSTR(VparaText, 1, LENGTH(VparaText) - 1) into VparaTemp from dual;
select SUBSTR(VselectText, 1, LENGTH(VselectText) - 1) into VSelectTemp from dual;
我得到这个错误:[error]pls-00204(195:106):pls-00204:函数或伪列“decode”只能在sql语句中使用
为什么我不能使用循环解码。
4条答案
按热度按时间1zmg4dgp1#
你可以用
case
而不是decode()
,或使用from dual
诡计。但归根结底,我不认为你需要一个游标和一个循环。使用字符串聚合可以获得所需的结果:注意,子查询并不是绝对必要的(您可以使用
listagg(distinct ...)
相反,它避免了重复nvl()
一次又一次的表达。0vvn1miw2#
您需要将解码部分作为select into from dual的一部分。你可以试试
声明新变量
VselectTextNew
```select VselectText ||'x."'|| cur1.COVID_RISK_ZONE_NAME||'"'|| ' AS ' || '"'|| decode(cur1.covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , cur1.covid_risk_zone_name)||'",'
into VselectTextNew from dual;
rta7y2nd3#
不幸的是解码不是一个真正的功能。它是一个表达式,不能在pl/sql中使用。仅在sql语句中。
rsaldnfx4#
非常感谢@gmb、@roberto hernandez和@akk0rd87的帮助。为了完成我的查询,我使用了@roberto hernandez技巧,但是他的查询必须被修改,因为它总是给我字符串中循环的最后一部分,因为“select vselecttext”总是重置我的字符串,所以必须修改它一点。
我还将尝试@gmb query,因为我在直接使用查询时遇到了一些问题。