2015-08-21 1 views
0

J'ai une liste de 100k identifiants dans un fichier. Je veux itérer ces ids:Insérer ou mettre à jour la table

pour chaque id, vérifier si id est dans une table:

  • Le cas échéant, mettre à jour son updated_date drapeau
  • Sinon, ajoutez un nouveau record (id, updated_date)

J'ai recherché et trouvé la clause MERGE. L'inconvénient est, MERGE nécessite les ID d'être dans une table. Je suis seulement autorisé à créer une table temporaire si nécessaire.

Est-ce que je peux me diriger dans la bonne direction? Ce doit être un script que je peux exécuter sur ma base de données, pas en code.

merge into MyTable x 
using ('111', '222', all my ids) b 
    on (x.id = b.id) 
when not matched then 
    insert (id, updated_date) values (b.id, sysdate) 
when matched then 
    update set x.updated_date = sysdate; 

EDIT: Je suis maintenant en mesure d'utiliser une table temporaire si c'est ma seule option.

+0

Bonjour créer une table externe avec ce fichier ID 100k. Puis interrogez cette table externe en utilisant la clause de votre instruction de fusion et comparez avec les identifiants mytable. – Buddi

Répondre

1

Étant donné que vous dites que vous ne pouvez pas créer une table temporaire, d'une façon peut-être de convertir votre liste des ids en un ensemble de syndicats choisit all'd, par exemple:

123, 
234, 
... 
999 

devient

select 123 id from dual union all 
select 234 id from dual union all 
... 
select 999 id from dual 

vous pouvez ensuite utiliser dans votre déclaration de fusion:

merge into MyTable x 
using (select 123 id from dual union all 
     select 234 id from dual union all 
     ... 
     select 999 id from dual) b 
on (x.id = b.id) 
when not matched then insert (id, updated_date) values (b.id, sysdate) 
when matched then update set x.updated_date = sysdate; 

Si vous avez vraiment 100k ids, il pourrait ta Ke un moment pour analyser la déclaration, cependant! Vous pourriez vouloir séparer les requêtes et avoir plusieurs instructions de fusion. Autre idée - n'y at-il pas un GTT existant que vous pourriez "emprunter" pour stocker vos données?

1

Si vous avez accès au fichier à partir de votre serveur Oracle, vous pouvez définir une table externe, ce qui vous permettra de lire le fichier à l'aide de SQL.

La syntaxe est basée sur SQL * Loader, et ce n'est peut-être pas quelque chose que vous voulez faire pour un travail occasionnel, plus d'une tâche récurrente.

Vous pouvez également utiliser SQL * Loader lui-même pour le charger dans une table, ou même ODBC à partir d'une base de données Microsoft Access ou similaire.

Une autre option consiste à exécuter 100 000 insertions. Vous pouvez en faire beaucoup mieux en effectuer respections quelque 100 inserts et les envelopper dans un bloc anonyme, qui permet de gagner de la base de données allers-retours, donc au lieu de:

insert into tmp values(1); 
insert into tmp values(12); 
insert into tmp values(145); 
insert into tmp values(234); 
insert into tmp values(245); 
insert into tmp values(345); 
.... 
insert into tmp values(112425); 

utilisation ...

begin 
    insert into tmp values(1); 
    insert into tmp values(12); 
    insert into tmp values(145); 
    insert into tmp values(234); 
    ... 
    insert into tmp values(245); 
end; 
/
begin 
    insert into tmp values(345); 
    ... 
    insert into tmp values(112425); 
end; 
/

Si c'était une tâche régulière, je choisirais certainement une table externe.

+0

C'est juste un one-off. emploi. J'écris le script, l'envoie aux DBA et ils l'exécutent. – TheCoder