Question

J'ai un bloc If Statement similaire à celui ci-dessous qui échoue avec l'erreur - PLS-00103: Rencontré le symbole "SELECT" lorsqu’on attend l’un des suivants ....

Begin
    If (select count(*) from Table1) > 0 then
        dbms_output.put_line('Test');
    end if;
end;

J'ai une déclaration de cas similaire qui fonctionne bien

select 
case 
    when (select count(*) from Table1) > 0
        then 2
    else
        1
end
from dual

D'après ce que j'ai lu dans la documentation Oracle, si et quand prend en charge une expression booléenne, indiquez si les sous-requêtes sont prises en charge dans les conditions If.

Remarque: Les instructions ont été simplifiées. Je ne vais pas vraiment obtenir le décompte de la table entière. Aucune suggestion d'optimisation, donc, s'il vous plaît

Était-ce utile?

La solution

Non, vous ne pouvez pas utiliser un SELECT à votre guise.

Dans votre exemple d'utilisation de CASE, vous n'utilisez pas un "relevé" CASE. - vous utilisez une expression CASE, qui est intégrée à une instruction SQL. Dans ce cas, vous pouvez utiliser une sous-requête car elle se situe dans le contexte d'une instruction SQL et non d'une instruction de procédure. Vous ne pourrez pas utiliser une sous-requête comme celle-ci dans une instruction CASE procédurale.

Autres conseils

Avez-vous appelé DBMS_OUTPUT.ENABLE

Exemple rapide

BEGIN
DBMS_OUTPUT.DISABLE;
DBMS_OUTPUT.PUT_LINE('Disabled');
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE('Enabled');
END;

Je ne crois pas que les sous-requêtes soient prises en charge dans les conditions IF ... PL / SQL s'attendra à ce que SELECT lui attribue un ensemble d'enregistrements et non une valeur unique à utiliser dans une expression / instruction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top