web-dev-qa-db-fra.com

Comment stocker le résultat de l'instruction select dans la table temporaire d'Oracle?

Nous pouvons écrire select column1,column2 into #temp from tableName dans SQL Server. Mais je ne peux pas écrire la même requête dans une base de données Oracle.

Je souhaite stocker le résultat de la sélection/insertion/suppression/mise à jour ou tout jeu de résultats dans une table temporaire locale de la base de données Oracle. Comment puis-je faire ceci?

J'exécute la requête ci-dessous dans mon outil de développement Oracle SQL:

select * into #temp 
from bmi;

mais je reçois l'erreur comme suit s'il vous plaît aider à trouver cette erreur.

lorsque j'exécute la même requête dans Microsoft SQL Server, elle est exécutée. La table #temp est créée. Elle n'est pas présente dans la base de données, mais elle peut contenir les données de cette session particulière. donc je veux le même scénario dans la base de données Oracle.

ORA-00911: caractère non valide 00911. 00000 - "caractère non valide" * Cause: les identificateurs ne peuvent pas commencer par un caractère ASCII autre que des lettres et des chiffres. $ # _ sont également autorisés après le premier caractère. Les identificateurs entre guillemets doubles peuvent contenir n'importe quel caractère autre qu'une guillemet double. Les guillemets alternatifs (q '# ... #') ne peuvent pas utiliser d'espaces, de tabulations ni de retours à la ligne comme délimiteurs. Pour tous les autres contextes, consultez le Manuel de référence du langage SQL. * Action: Erreur à la ligne: 1 Colonne: 15

2
sandesh jogi

Je souhaite stocker le résultat de la sélection/insertion/suppression/mise à jour ou tout jeu de résultats dans une table temporaire locale de la base de données Oracle. Comment procéder?

Tu ne peux pas. Oracle n'a pas de tables temporaires locales, cela ne fonctionne pas comme ça. Mais ce n'est pas nécessaire. Oracle a un modèle interne très différent de SQL Server, ce qui signifie que de nombreuses pratiques SQL Server ne sont pas nécessaires dans Oracle. (Pour être juste, SQL Server a des choses bien nettes, contrairement à Oracle, comme ANSI 92 Joins for DML.)

Les informations clés sont les suivantes: vous ne souhaitez pas stocker le résultat de select/insert/delete/update ou de tout jeu de résultats dans une table temporaire locale. C'est quelque chose que vous deviez faire dans T-SQL pour atteindre l'objectif final consistant à implémenter une logique métier. Mais ce que vous avez réellement voulu dans SQL Server et ce que vous {souhaitez) dans Oracle est écrivez du code qui apporte de la valeur à votre organisation .

Alors, avec cet état d'esprit en place, que devez-vous faire? 

Si vous souhaitez effectuer une boucle autour d'un résultat, alors/ une boucle de curseur correspond à ce que vous cherchez?

for rec in ( select * from some_table
             where the_date = date '2018-02-01' )
loop
    ...

Si vous voulez travailler sur certaines données avant de les insérer dans une donnée, vous devriez peut-être utiliser une collection PL/SQL :

type l_recs is table of some_table%rowtype;

Mais peut-être avez-vous simplement besoin de comprendre le modèle de gestion des transactions d'Oracle . Beaucoup de choses sont possibles en SQL pur sans avoir besoin de cadre procédural. 

3
APC

Créer table temporaire :

create global temporary table 
results_temp (column1, column2)
on commit preserve rows;

puis insérez-y de votre table:

insert into results_temp (column1, column2 )
SELECT column1,column2 
FROM source_table
0
user7294900
create global temporary table temp_table_name
on commit preserve rows as select column1,column2,columnN from your_table;
0
venkatesh