2010-07-13 2 views
1

Je vais avoir besoin de générer un fichier de script d'insertion de feuille Excel. Je réussis partiellement à générer un fichier de script. Mais j'ai été frappé dans une situation, j'ai besoin d'aide de any1.génération Oracle script PL/SQL de feuille Excel

Ma logique est quelque chose comme ça, Lire la première cellule, vérifier si la valeur de la cellule existe déjà dans DB.If pas, générer un script d'insertion comme suit

declare 
    PK1 integer; 
begin 
    select tablename_seq.currval into PK1 from dual; 
    insert into TableName valuestablename_seq_seq.nextval,'Blagh',1); 
end; 

Im stockage PK1 dans Hashtable avec les données ont KEY .so que si les mêmes données apparaissent dans les lignes suivantes, en utilisant la recherche Hashtable, j'obtiendrai la valeur de hachage pour la clé de données correspondante et la passerai à un autre script d'insertion. Mais chaque fois que je générer de nouvelles variables comme PK1, PK2 ... etc.I ont garder le mot clé « BEGIN » après Déclare et également ajouter le mot clé « END » après chaque insertion, si je le fais la portée de la variable sort hors champ. J'utilise peut-être ces variables déclarées dans une autre instruction insert a un paramètre. Y a-t-il une chance d'enregistrer PK1, Pk2 ..... a des variables de session/globales pour l'exécution du script. Ils deviendront donc disponibles pour tout le temps d'exécution du script.

Répondre

2

Mon inclination est-à-dire que chaque ligne de votre feuille de calcul devrait juste être créer une déclaration comme insert into TableName values (tablename_seq_seq.nextval,'Blagh',1) returning ID into PK1;, puis enveloppez le tout dans un seul bloc DECLARE BEGIN-END avec les variables appropriées définies, quelque chose comme:

declare 
    pk1 integer; 
    pk2 integer; 
begin 
    insert into TableName 
     values (tablename_seq_seq.nextval,'Blagh',1) 
     returning ID into PK1; 
    insert into TableName 
     values (tablename_seq_seq.nextval,'Urgh',2) 
     returning ID into PK2; 
    [...] 
end; 

Vous pouvez même créer la liste des déclarations variables dans une colonne et SQL dans un autre, puis copiez et collez-les dans le bon endroit dans le bloc.

+0

Chaque cellule générera script insertion dans correspondant table.I l'utilisation ci-dessus Technic, problème est, si je dois utiliser la variable PK1 quelque part dans la cellule (10,10) s 'script insert , parce que nous terminons 'end' immédiatement après le bloc Begin, la portée de PK1 doit toujours rester dans Begin block.Scope PK1 LOst.Pour cela, j'ai créé Begin avec un insert et ensuite en créer un autre Begin avec un autre insert et ainsi de suite la fin im ajoutant end; end; Mais le problème avec la méthode ci-dessus est, j'essaie d'insérer 400 cellules insérer des scripts. dans ce flux lorsque j'essaie d'exécuter le script, il génère une erreur d'exécution 'Stack Overflow' – user145610

0

Est-ce la question de la meilleure façon de mettre à jour une base de données à partir d'une feuille de calcul ou la meilleure façon de générer un script à partir d'une feuille de calcul? Je recommande de charger les données de la feuille de calcul dans une table temporaire, puis d'utiliser une simple instruction INSERT/SELECT, à moins que vous ne soyez inquiet des collisions d'unicité, auquel cas j'utiliserais une instruction MERGE à la place. C'est beaucoup plus facile que d'essayer de générer un script avec une logique pour chaque instruction d'insertion.

1

Je commence avec un

DECLARE 
    PROCEDURE action (p_val IN INTEGER) IS 
    ... 
    END action; 
BEGIN 

Ensuite ont chaque ligne dans la feuille de calcul faire juste un appel à la procédure de telle sorte qu'une entrée de feuille de calcul 1 devient

action (1); 

Ensuite, vous finissez avec quelque chose comme

DECLARE 
    PROCEDURE action (p_val IN INTEGER) IS 
    ... 
    END action; 
BEGIN 
    action (1); 
    action (8); 
    action (23); 
    action (1); 
    action (1); 
END; 

La procédure d'action peut être aussi compliquée que vous le souhaitez, le stockage i informations dans des tableaux/tableaux quelconques.

0

au lieu de chaque ligne, tenez compte que chaque cellule. Chaque cellule générera un script d'insertion dans la cellule correspondante. J'ai créé de la même manière, le problème est Si je veux utiliser PK1 variable quelque part dans la ligne 10, colonne 10 (valeur de la cellule) insert script, parce que nous terminons 'end' immédiatement après le bloc Begin, la portée de PK1 toujours Rester dans le bloc Begin.Pour cela, j'ai créé Begin avec un insert et ensuite créer un autre Begin avec un autre insert et ainsi de suite. Et @ la fin im ajoutant end; end; Mais le problème avec la méthode ci-dessus est, j'essaie de insérer 200 lignes X 200 colonnes = 400 cellules insérer des scripts. dans ce flux lorsque je tente d'exécuter le script, il jette un Si vous utilisez Oracle E-Business Erreur d'exécution « Stack Overflow »