【问题标题】:Best way to perform an Oracle query on a cell?对单元执行 Oracle 查询的最佳方式?
【发布时间】:2011-02-26 17:54:19
【问题描述】:

我有一个 Excel 电子表格,其中一个单元格包含串联的姓名和姓氏(不要问为什么)。例如,单元格 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/whatever 脚本来遍历 Excel 电子表格(或 .csv 文件),然后执行查询等,但我认为可能有一个Excel 本身的快捷方式。

【问题讨论】:

  • 在 A2 单元格上运行此 SQL 是什么意思? A2 单元格是否与此问题相关?
  • 确实,我需要使用单元格的内容在SQL中做一个where条件。

标签: sql excel database oracle


【解决方案1】:
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 的情况下编写它

【讨论】:

  • 太棒了!非常感谢。我真的很感激你花时间给我一个答复。它奏效了! :D
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多