EXECUTE IMMEDIATE avec la clause USING donnant des erreurs
-
06-07-2019 - |
Question
Tous,
Je suis très nouveau dans le domaine des procédures stockées en général, mais je me débat particulièrement avec celles d’Oracle. J'ai créé un exemple très simple de ce que j'essaie d'accomplir et je reçois toujours la même erreur avec cette version simplifiée.
L'exemple de procédure stockée est le suivant:
CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
DECLARE
v_tab VARCHAR2(50);
v_strSQL VARCHAR2(50);
BEGIN
v_strSQL := 'SELECT * FROM :1';
v_tab := 'ex.emp';
EXECUTE IMMEDIATE v_strSQL USING v_tab;
END;
END;
Lorsque j'appelle la procédure stockée ci-dessus à l'aide de CALL ashish_test ()
, je reçois:
Basé sur cet article (Recherchez Exemple 7-1), le mot clé USING
doit remplacer le paramètre fictif numéroté (: 1
) dans v_strSQL
avec la valeur stockée. dans v_tab
. Cependant, je continue à avoir une erreur de table invalide. Je suppose que c'est parce que EXECUTE IMMEDIATE
est incapable de remplacer le paramètre fictif par la valeur pour une raison quelconque, mais je ne suis pas sûr de savoir pourquoi. Est-ce que quelqu'un sait si je fais quelque chose de stupide ici?
Je l’utilise sur la base de données Oracle 10g & amp; en utilisant PL / SQL Developer.
La solution
La clause USING concerne uniquement les variables de liaison (c'est-à-dire, où vous utiliseriez des noms de colonne dans une instruction select), pas les noms de table. Une utilisation typique ressemblerait à ceci:
Select col1 from table1 where col2 = :a
Si vous souhaitez utiliser des noms de table de variables, utilisez quelque chose comme ceci:
v_tab := 'ex.emp';
v_strSQL := 'SELECT * FROM ' || v_tab;
EXECUTE IMMEDIATE v_strSQL;