Использовать инструкцию Decode in L oop в Oracle PL / SQL - PullRequest
0 голосов
/ 03 августа 2020

Я хочу использовать декодирование в операторе L oop в oracle, но не могу этого сделать. Это мой запрос

             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;

Я получаю эту ошибку: [Ошибка] PLS-00204 (195: 106): PLS-00204: внутри * 1009 можно использовать функцию или псевдостолбец «DECODE» * только инструкция

Почему я не могу использовать декодирование в L oop.

Ответы [ 4 ]

2 голосов
/ 03 августа 2020

Вы можете использовать case вместо decode() или использовать трюк from dual. Но суть в том, что я не думаю, что вам нужен курсор и al oop здесь. Вы можете получить желаемый результат, используя агрегирование строк:

select
    listagg(
        ''''
            || covid_risk_zone_name 
            || ''' as "' 
            || covid_risk_zone_name 
            || '"', 
        ', '
    ) into VparaText,
    listagg(
        'x."' 
            || covid_risk_zone_name 
            || '" as "' 
            || decode(covid_risk_zone_name, 'No Classification' , 'Market Opened', 'No Data', 'No Info Avlbl' , covid_risk_zone_name) 
            || '"', 
        ', ') into VselectText
from (
    select distinct nvl(covid_risk_zone_name, 'No Data') covid_risk_zone_name 
    from covid_daily_status
) t

Обратите внимание, что подзапрос не является строго необходимым (вместо этого вы можете использовать listagg(distinct ...), но он позволяет избежать повторения выражения nvl() снова и снова.

1 голос
/ 03 августа 2020

Вам нужно поместить секцию декодирования как часть 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;

Заменить последнюю часть новой переменной

0 голосов
/ 03 августа 2020

Большое спасибо @GMB, @Roberto Hernandez и @ akk0rd87 за их помощь. Чтобы завершить свой запрос, я использовал уловку @Roberto Hernandez, но его запрос пришлось изменить, так как он всегда давал мне последнюю часть l oop в строке, поскольку «select VselectText» всегда сбрасывал мою строку, поэтому пришлось изменить ее бит.

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||'",';
                    
                    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;
                    
                    vLong := vLong||VselectTextNew; --- Added new string.
                    

                    end loop;

                select SUBSTR(VparaText, 1, LENGTH(VparaText) - 1) into VparaTemp from dual;  
                
                select SUBSTR(vLong, 1, LENGTH(vLong) - 1) into VSelectTemp from dual;

Я также попробую запрос @GMB, так как я столкнулся с проблемой при использовании запроса напрямую.

0 голосов
/ 03 августа 2020

К сожалению, декодирование на самом деле не функция. Это выражение, и его нельзя использовать в PL / SQL. Только в операторах SQL.

...