Je veux créer une table temporaire dans une procédure stockée et y accéder de la même manière, mais j'ai obtenu une erreur que ORA-00942:Table or view does not exists.
Voici la procédure que j'ai essayée,
Create procedure myproc
IS
stmt varchar2(1000);
BEGIN
stmt:='CREATE GLOBAL TEMPORARY table temp(list if columns) ON COMMIT DELETE ROWS';
execute immediate stmt;
insert into temp values('list of column values');
END;
C’est ainsi que j’ai utilisé pour créer une table temporaire, mais une erreur s’est produite. Existe-t-il un autre moyen d’exécuter cette tâche?
Il suffit de le créer d'abord (une fois, en dehors de votre procédure), puis de l'utiliser dans votre procédure. Vous ne voulez pas (essayer de) le créer à chaque appel de la procédure.
create global temporary table tmp(x clob)
on commit delete rows;
create or replace procedure...
-- use tmp here
end;
Create or replace procedure myprocedure
is
stmt varchar2(1000);
stmt2 varchar2(1000);
begin
stmt := 'create global temporary table temp(id number(10))';
execute immediate stmt;
stmt2 := 'insert into temp(id) values (10)';
execute immediate stmt2;
end;
J'ai édité cette réponse car elle était fausse. Je suis une récente conversion MSSQL et, en raison de la manière dont Oracle implémente les tables temporaires globales, si vous avez VRAIMENT besoin d’utiliser des tables temporaires, créez-les une fois et laissez-les là. À moins que vous n'utilisiez exclusivement SQL dynamique dans vos processus (débogage amusant), vous ne pourrez pas compiler votre paquet avec succès si les tables référencées n'existent pas déjà. Oracle valide tous les objets référencés dans les méthodes que vous tentez de compiler. C'est pourquoi vous avez l'erreur 942. J'aime la manière dont Oracle gère l'étendue avec ces tables temporaires globales. Cela, seul, m'a vendu sur l'idée.