J'exécute le script suivant -
BEGIN
select department_name
from egpl_department
where department_id in (select department_id
from egpl_casemgmt_activity);
END ;
Et j'ai l'erreur -
PLS-00103: Encountered the symbol "end-of-file" when
expecting one of the following:
;
Dans une instruction de sélection de bloc PL/SQL doit avoir une clause into
:
DECLARE
v_department egpl_department.department_name%type;
BEGIN
select department_name
into v_department
from egpl_department
where department_id in (select department_id from egpl_casemgmt_activity);
-- Do something useful with v_department
END;
En PL/SQL, vous ne pouvez pas simplement sélectionner certaines données. Où le résultat est-il censé aller?
Vos options sont:
Supprimez BEGIN
et END
et exécutez SELECT avec SQL * plus ou un autre outil qui peut exécuter une instruction SQL et présenter le résultat quelque part.
Utilisation SELECT department_name INTO dep_name
pour mettre le résultat dans une variable PL/SQL (ne fonctionne que si votre SELECT retourne une seule ligne)
Utilisation SELECT department_name BULK COLLECT INTO dep_name_table
pour mettre le résultat dans une table PL/SQL (fonctionne pour plusieurs lignes)
Ou peut-être pouvez-vous décrire ce que vous essayez de réaliser et dans quel environnement vous souhaitez exécuter le code SQL ou PL/SQL.
PLS-00103
signifie toujours que le compilateur a lancé parce que nous avons fait une erreur de syntaxe. Ce serait vraiment bien si le texte du message disait: You have made a syntax error, please check your code
mais hélas non.
La documentation d'Oracle est complète et en ligne. Vous pouvez trouver la section sur l'intégration des requêtes SQL dans PL/SQL ici . Je vous invite à le lire, à anticiper votre prochaine question. Parce qu'une fois que vous avez corrigé le bloomer de syntaxe simple, vous allez frapper TOO_MANY_ROWS (en supposant que vous avez plus d'un département).
Pour éviter le problème too_many_rows, vous pouvez utiliser un curseur, quelque chose comme ça (je n'ai pas testé cela, mais le long de ces lignes)
DECLARE
v_department egpl_department.department_name%type;
cursor c_dept IS
select department_name
into v_department
from egpl_department
where department_id in (select department_id from egpl_casemgmt_activity)
order by department_name;
BEGIN
OPEN c_dept;
FETCH c_dept INTO v_department;
CLOSE c_dept;
-- do something with v_department
END;
Cela mettra la première valeur trouvée dans le tableau dans v_department. Utilisez la clause ORDER BY pour vous assurer que la ligne retournée sera celle dont vous avez besoin, en supposant qu'il y avait la possibilité de 2 valeurs différentes.