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:

message d'erreur http://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top