Excel电子表格 - 在单元格上执行Oracle查询的最佳方式

时间:2010-06-02 09:56:10

标签: sql database oracle excel spreadsheet

我有一个Excel Spreadsheeet。

有一个包含连接名称和姓氏的单元格(不要问为什么),例如:

Cell A2 BLOGGSJOE

在这个单元格中,我想运行以下SQL并将其输出到单元格A3,A4和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'

知道如何在每个单元格上执行oracle查询并返回结果吗?

我在Excel中启用了oracle数据源连接,但不知道现在该做什么。

这是一种愚蠢的方法,你能推荐一种更好的方法吗?

非常感谢!我在这类事情上缺乏必要的经验! : - )

编辑:我知道我可以写一个简单的ruby / php / python /无论什么脚本循环遍历excel电子表格(或csv文件),然后执行查询等但我认为可能会有一个快速在excel本身的方式。

2 个答案:

答案 0 :(得分: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

如果您正确格式化电子表格,则可以将rs指定给Variant,然后将变量指定给范围而不是循环遍历它。

修改

使用当前的SQL,您需要遍历每个单元格并查询数据库,然后将结果保存到A3:A5。 编辑2 ,类似的东西:

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

请注意,我使用了您想要的不同单元格,而GetRow是2D而不是1D,但我很难将其编写而无法访问实际的电子表格/ db

答案 1 :(得分:0)

请检查我的回答here。 使用该代码,您可以调用Oracle查询(递归或不递归)。 我认为这会更快:

  1. 首先构建要检索的项目列表(BLOGGSJOE,JOEBAR,JUSTINCASE)
  2. 然后使用IN(BLOGGSJOE,JOEBAR,JUSTINCASE)作为您的标准在单独的列表中检索您的Oracle数据
  3. 最后在新下载的列表中使用Excel进行查找