L'exécution d'une instruction sql stockée dans un paramètre de procédure
J'ai une question à propos des procédures stockées dans Oracle.
Ci-dessous la procédure stockée et tables comme il est:
create table STORES
(
ID number,
NAME varchar2(100),
CITY varchar2(100),
EXPIRES DATE
)
insert into stores values(1, 'Store 1', 'City 1', sysdate);
insert into stores values(2, 'Store 2', 'City 1', sysdate);
insert into stores values(3, 'Store 3', 'City 2', sysdate);
create table CLOSED
(
ID number,
NAME varchar2(100),
CITY varchar2(100)
)
create or replace PROCEDURE
pr_TestProc(subQuery IN VARCHAR2)
IS
begin
insert into CLOSED (ID, NAME, CITY)
select ID, NAME, CITY
from STORES
where ID in (1, 2, 3);
end;
Ce que je voudrais faire est de remplacer le "en" valeurs avec la sous-requête transmise en tant que paramètre.
Donc, si je lance la procédure comme:
execute pr_TestProc('select ID from STORES where EXPIRES <= sysdate');
La requête passée dans devrait être exécutée comme une sous-requête en cours d'exécution à l'intérieur de la procédure.
Quelque chose comme:
insert into CLOSED (ID, NAME, CITY) select ID, NAME, CITY
from STORES
where ID in (execute(subQuery));
Évidemment, cela ne fonctionne pas, mais quelle serait la meilleure façon d'y parvenir, ou est-ce même possible?
Grâce,
Brian
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le SQL dynamique
Si vous êtes à l'appel de cette procédure rarement dans un système qui est relativement inactif, qui fonctionnera probablement de façon acceptable. Si vous appelez fréquemment avec les différents sous-requêtes, cependant, vous allez générer une tonne de non-partageable SQL. Qui va les obliger à Oracle à faire beaucoup de dur de l'analyse. Il sera également l'inondation de votre piscine partagée avec les non-partageable SQL, probablement en forçant les plans que vous souhaitez être mis en cache, forçant le plus dur de l'analyse lorsque ces instructions SQL sont exécutées ensuite de nouveau. Et si vous le faites assez rapidement, vous êtes susceptibles de finir par faire des erreurs (ou de causer d'autres procédés pour obtenir des erreurs) que l'Oracle ne pouvait pas allouer suffisamment de mémoire dans la piscine commune pour une requête particulière. De Plus, le SQL dynamique est plus difficile d'écrire, plus difficile à déboguer, vulnérables aux attaques par injection SQL, etc. il est donc généralement le système plus difficile à gérer.
Une solution plus élégante serait de passer dans une collection plutôt qu'une sous-requête serait de passer dans une collection
Peut-être que vous n'avez pas besoin de passer la requête dans la procédure stockée. Il suffit d'appeler la procédure stockée avec la requête en tant que paramètre.
Appeler la procédure stockée comme ceci: