2017-05-22 2 views
1

J'utilise un curseur dynamique pour extraire des données. Requête qui est en cours d'exécution ressemble à:Oracle - Utilisation de la variable de liaison dans la clause LIKE du curseur dynamique

query := 'SELECT column1, column2 
      FROM my_table 
      WHERE column1 LIKE ''%:bv1%'''; 

Et le curseur lui-même est exécuté comme ceci:

OPEN my_cursor FOR query USING my_var1; 

J'ai essayé aussi de vérifier la requête et l'imprimer:

... WHERE column1 LIKE '%:bv1%' ... 

donc les apostrophes sont échappées, mais le curseur ne récupère aucune donnée. Est-il même possible d'utiliser des variables de liaison dans la clause LIKE et si oui, qu'est-ce que j'ai fait de mal?

Répondre

2

C'est subtil. Il est souvent utile de commencer avec une instruction statique, de la corriger, puis de la convertir en SQL dynamique.

Dans SQL non dynamique, nous pourrions le faire comme ceci:

SELECT column1, column2 
FROM my_table 
WHERE column1 LIKE '%' || local_var || '%'; 

L'équivalent dynamique est

query := 'SELECT column1, column2 
      FROM my_table 
      WHERE column1 LIKE ''%''||:bv1||''%'' '; 
+0

Merci, ça marche maintenant. Je l'ai fait exactement comme vous l'avez dit - passant de la déclaration statique à la dynamique, je n'avais aucune idée que je devais encore utiliser les opérateurs '||' dans la requête dynamique. –

1

Prenez la variable de liaison de la chaîne:

VARIABLE mycursor REFCURSOR; 
VARIABLE bv1 VARCHAR2; 

BEGIN 
    :bv1 := 'X'; -- set the bind variable 
END; 
/

DECLARE 
    query VARCHAR2(200) := 'SELECT * FROM DUAL WHERE DUMMY LIKE :value'; 
BEGIN 
    OPEN :mycursor FOR query USING '%' || :bv1 || '%'; 
END; 
/

PRINT mycursor; 

Sortie

MYCURSOR 
-------- 
DUMMY 
----- 
X 
+0

Maintenant, je reçois 'PLS-00049: mauvaise variable de liaison « LV_CTYPE'' –

+0

@PeterGubik Mis à jour – MT0

+0

Cela fonctionnerait très probablement aussi, mais la solution ci-dessus est plus utile pour mes besoins. Merci quand même :) –