web-dev-qa-db-fra.com

PLS-00103: A rencontré le symbole "fin de fichier" lors de l'attente de l'une des situations suivantes:;

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: 
;
12

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; 
15
diederikh

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.

8
Codo

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).

7
APC

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.

4
steve godfrey