Procédures stockées SQL Oracle Call vs Execute
Problème
J'essaie de comprendre la différence entre Oracle SQL commandes CALL
et EXECUTE
.
J'ai été en utilisant CALL
pour le coup d'envoi de procédures stockées, mais en parlant avec un autre développeur, j'ai trouvé qu'il utilise presque exclusivement EXECUTE
. J'ai fait quelques recherches en ligne pour voir si je faisais quelque chose incorrectement, mais je ne vois pas de distinction claire entre les deux commandes, et les gens semblent utiliser de manière interchangeable.
Basé sur la documentation, ils semblent remarquablement similaire (au moins en termes d'interaction avec les procédures stockées).
- http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4008.htm
- http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12022.htm
- http://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_app_dbms_aw026.htm
Il ne ressemble à CALL
universel est une commande SQL alors que EXECUTE
semble être propriétaire, je serais enclin à utiliser CALL
sur EXECUTE
mais là encore je ne sais pas ce que cela signifie en ce qui concerne les performances.
Questions
- Est l'un prime sur l'autre en termes de coups de pied sur une procédure stockée? Est-il question?
- Si il n'importe, ce qui est une situation où l'un des deux est-elle appropriée?
- Existe-il des écarts de performances entre les deux? Quelle est la meilleure pratique?
source d'informationauteur DanK
Vous devez vous connecter pour publier un commentaire.
Les deux
EXEC[ute] SP()
etCALL SP()
pourrait être utilisé dans SQL*Plus pour exécuter un SP. BTW, vous pouvez également utiliserBEGIN SP(); END;
Mais il ya quelques différences.
CALL
est Oracle SQL et devrait fonctionner partout. D'autres DB clients qui peuvent parler Oracle peut ou ne peut pas prendre en charge SQL*Plus EXEC. Beaucoup le font (par exemple, Oracle SQL Developer, SQLWorkbench/J), mais certains ne le font pas (Liquibase).Les types de données des paramètres transmis par le
CALL
déclaration doit être de types de données SQL. Ils ne peuvent pas être PL/SQL-seuls les types de données tels que des valeurs BOOLÉENNES.EXEC
peut être utilisée pour exécuter non seulement le PS, mais l'arbitraire d'un énoncé.Si le PS n'a pas de paramètres, vous pouvez utiliser
EXEC SP;
la syntaxe, maisCALL
nécessite des parenthèses vides:CALL SP();
Si vous appelez un proc qui renvoie un sys_refcursor à l'aide de Crapaud, il y a une différence entre les APPELS et EXEC.
création de la procédure foo(j'en nombre,o sortir sys_refcursor)
comme
commencer
ouvert o pour
sélectionnez j'from dual;
fin;
exec foo(1, r); -- les sorties 1 ligne
appeler foo(1, r); -- sorties 0 lignes
-- Remarque: lorsque vous préfixe d'un paramètre avec un deux-points, le Crapaud vous invite pour le type (qui dans ce cas est d'un curseur).
EXÉCUTER prend une chaîne de caractères comme un paramètre qui permet d'exécuter du sql dynamique. Exécuter est essentiellement à dire... avec cette chaîne d'entrée exécuter le SQL du moteur sur le contenu.
APPEL transfère le contrôle à une procédure stockée ou d'un module.
Comme vous pouvez le voir sur le plan conceptuel, ils sont très différents. Si vous êtes à la simple exécution d'une procédure, cependant, dans la pratique, pour ce cas d'utilisation, ils sont les mêmes.
Je crois que pour la plus claire code, sauf si vous avez besoin d'exécuter, vous devriez utiliser l'appel.