web-dev-qa-db-fra.com

Déclaration d'une variable et définition de sa valeur à partir d'une requête SELECT dans Oracle

Dans SQL Server, nous pouvons utiliser ceci:

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;

Comment puis-je faire la même chose dans Oracle? J'essaye actuellement ce qui suit:

DECLARE COMPID VARCHAR2(20);
SELECT companyid INTO COMPID from app where appid='90' and rownum=1;

Pourquoi ce n'est pas fonctionne ?

enter image description here

31
user960567

CHOISIR IN

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;

Assurez-vous que la requête ne renvoie qu'une seule ligne:

Par défaut, une instruction SELECT INTO ne doit renvoyer qu'une seule ligne. Sinon, PL/SQL déclenche l'exception prédéfinie TOO_MANY_ROWS et les valeurs des variables dans la clause INTO ne sont pas définies. Assurez-vous que votre clause WHERE est suffisamment spécifique pour ne correspondre qu'à une seule ligne

Si aucune ligne n'est renvoyée, PL/SQL déclenche NO_DATA_FOUND. Vous pouvez vous protéger de cette exception en sélectionnant le résultat d'une fonction d'agrégation, telle que COUNT (*) ou AVG (), le cas échéant. Il est garanti que ces fonctions renvoient une seule valeur, même si aucune ligne ne correspond à la condition.

Une instruction SELECT ... BULK COLLECT INTO peut renvoyer plusieurs lignes. Vous devez configurer des variables de collection pour conserver les résultats. Vous pouvez déclarer des tableaux associatifs ou des tables imbriquées qui grossissent selon les besoins pour contenir l'ensemble des résultats.

Le curseur implicite SQL et ses attributs% NOTFOUND,% FOUND,% ROWCOUNT et% ISOPEN fournissent des informations sur l'exécution d'une instruction SELECT INTO.

62
Thilo

Pas tout à fait sûr de ce que vous recherchez, mais en PL/SQL

DECLARE
  v_variable INTEGER;
BEGIN
  SELECT mycolumn
    INTO v_variable
    FROM myTable;
END;

Ollie.

5
Ollie

Un point supplémentaire:

Lorsque vous convertissez de tsql à plsql, vous devez vous préoccuper de l'exception no_data_found

DECLARE
   v_var NUMBER;
BEGIN
   SELECT clmn INTO v_var FROM tbl;
Exception when no_data_found then v_var := null; --what ever handle the exception.
END;

Dans tsql si no data found alors la variable sera null mais pas exception

1
Praveen

ORA-01422: l'extraction exacte renvoie plus que le nombre de lignes demandé

si vous ne spécifiez pas l'enregistrement exact à l'aide de la condition where, vous obtiendrez l'exception ci-dessus.

DECLARE
     ID NUMBER;
BEGIN
     select eid into id from employee where salary=26500;
     DBMS_OUTPUT.PUT_LINE(ID);
END;
0
user3325275

Pour stocker une sortie d'une seule ligne dans une variable de la requête select into: 

déclarer le v_username varchare (20); SELECT le nom d'utilisateur dans le v_username FROM utilisateurs WHERE id_utilisateur = '7';

cela stockera la valeur d'un seul enregistrement dans la variable v_username.


Pour stocker plusieurs lignes dans une variable de la requête select into: 

vous devez utiliser la fonction listagg. listagg concatène les lignes résultantes d'une colonne en une seule colonne et, pour les différencier, vous pouvez utiliser un symbole spécial. utilisez la requête ci-dessous SELECT listagg (nom d'utilisateur || ',') dans le groupe (ordre par nom d'utilisateur) dans v_username FROM users;

0
Vincent Lal