2010-06-02 5 views
2

J'ai un Spreadsheeet Excel.Feuille de calcul Excel - Meilleure façon d'effectuer une requête Oracle sur une cellule

Il y a une cellule contenant un nom et prénom concaténés (ne demandez pas pourquoi), par exemple:

cellule A2 BLOGGSJOE

Sur cette cellule, je voudrais exécuter le SQL et la sortie suivante à la cellule A3, A4 et A5

SELECT i.id, i.forename, i.surname FROM individual i WHERE UPPER(REPLACE('" & A2 & "', ' ', '')) = UPPER(REPLACE(i.surname|| i.forename, ' ', '')) AND NVL(i.ind_efface, 'N') = 'N' 

Toute idée comment je pourrais effectuer une requête Oracle sur chaque cellule et renvoyer le résultat?

J'ai activé une connexion de source de données Oracle dans Excel, je ne sais pas quoi faire maintenant.

Est-ce une approche stupide, et pouvez-vous recommander une meilleure façon plus compétente?

Merci beaucoup! Je n'ai pas l'expérience nécessaire dans ce genre de chose! :-)

EDIT: Je suis conscient que je pourrais juste écrire un simple script ruby ​​/ php/python/quelquechose pour faire une boucle dans la feuille de calcul Excel (ou fichier csv), puis exécuter la requête, etc. pourrait être un moyen rapide dans Excel lui-même.

+0

La cellule A2 est-elle pertinente pour cette question? – Mike

+0

En effet, j'ai besoin d'utiliser le contenu de la cellule pour faire un critère where dans le SQL. – Flukey

Répondre

2
Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim sql As String 

Set cn = New ADODB.Connection 
cn.ConnectionString = 'Get one from http://www.connectionstrings.com/oracle 
'eg. "Driver={Oracle in OraHome92};Dbq=tns;Uid=uid;Pwd=pwd;" 
cn.Open 

sql = Your SQL 

Set rs = cn.Execute(sql) 

for loop or something to paste records 

rs.Close 
cn.Close 
Set rs = Nothing 
Set cn = Nothing 

si vous formatez votre feuille de calcul vous pouvez attribuer correctement rs à une variante et puis affectez la variante à une plage au lieu de la boucler.

Modifier

Avec votre SQL actuelle, vous devez faire une boucle à travers chaque cellule et d'interroger la db, puis enregistrez les résultats à A3: A5. Edit 2, quelque chose comme ça:

Private Function GetRow(user As String) As Variant 
Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim sql As String 
Dim v As Variant 

Set cn = New ADODB.Connection 
cn.ConnectionString = "Driver={Oracle in OraHome92};Dbq=tns;Uid=uid;Pwd=pwd;" 
cn.Open 

sql = "SELECT i.id, i.forename, i.surname FROM individual i WHERE UPPER(REPLACE('" & user & "', ' ', '')) = UPPER(REPLACE(i.surname|| i.forename, ' ', '')) AND NVL(i.ind_efface, 'N') = 'N'" 

Set rs = cn.Execute(sql) 

v = rs.GetRows() 
GetRow = v 

rs.Close 
cn.Close 
Set rs = Nothing 
Set cn = Nothing 
End Function 

Sub a() 
Dim user As String 
For i = 2 To x 
    user = ActiveSheet.Cells(i, 1).Value 

    GetRow (user) 
    ActiveSheet.Cells(i, 2).Value = GetRow(0) 
    ActiveSheet.Cells(i, 3).Value = GetRow(1) 
    ActiveSheet.Cells(i, 4).Value = GetRow(2) 

Next 

End Sub 

Notez que je l'ai utilisé différentes cellules que vous vouliez et getRow est en 2D non 1D, mais il est difficile pour moi de l'écrire avec pas accès à une feuille de calcul réel/Que voulez-vous dire en exécutant cette SQL sur la cellule A2?

+0

Excellent! Merci infiniment. J'apprécie vraiment le temps que vous avez consacré à cela pour me donner une réponse. Cela a fonctionné un régal! :RÉ – Flukey

0

Veuillez vérifier ma réponse here. En utilisant ce code, vous pouvez appeler votre requête Oracle (récursivement ou non). Je pense qu'il serait plus rapide à:

  1. d'abord construire une liste d'éléments à récupérer (BLOGGSJOE, JoeBar, JustInCase)
  2. puis récupérer vos données Oracle dans une liste séparée en utilisant IN (BLOGGSJOE, JoeBar, JustInCase) comme critère
  3. enfin faire une recherche dans Excel sur cette liste nouvellement téléchargé
Questions connexes