sous-requête scalaire dans l'instruction if Condition dans PL / SQL
-
03-07-2019 - |
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
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.