Ref:http://blog.csdn.net/iamlaosong/article/details/8465177

Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的人带来很大的福音,结合着Excel的数据处理与图表制作,就能很轻松地处理一些常规工作。

日常工作中需要查询各种数据,而且不断变化,处理这些数据的人不是技术人员,不会连接数据库自己查询,通过下面的办法就可以让技术人员编辑好包含查询语句的excel文件,让管理人员自己输入条件取数了。

我的方法是编辑需要的SQL语句保存在单元格中,并在查询条件需要参数值的地方用问号“?”代替,再在其他单元格中保存查询条件所需的参数值,在“宏”中用参数值替换掉SQL语句中的问号,最后执行查询语句并将结果保存到excel表中。

以下是通过Excel的VBA连接Oracle并读取Oracle相关数据的步骤:

  1、引用ADO相关组件:

打开VBA编辑器,在菜单中点选“工具”--》“引用”。确保“Microsoft ActiviteX Data Objects 2.8 Library”和“Microsoft ActiviteX Data ObjectS Recordset 2.8 Library”被勾选上。

  2、建立读取数据的过程:

  1. Public Sub get_data()
  2. '根据工作表中的查询语句读取数据
  3. On Error GoTo ErrMsg:
  4. Dim cnn As Object, rst As Object
  5. Dim name, stat, sqls, field As String
  6. Dim pn(4), pm(4) As String
  7. Dim i, j, kk, pmkk, lineno As Integer
  8. Dim OraOpen As Boolean
  9. Set cnn = CreateObject("ADODB.Connection")
  10. Set rst = CreateObject("ADODB.Recordset")
  11. sqls = "connect database"
  12. cnn.Open "Provider=msdaora;Data Source=dl580;User Id=sxjkuser;Password=sxjkpasswd;"
  13. OraOpen = True '成功执行后,数据库即被打开
  14. If OraOpen Then lineno = [D65536].End(xlUp).Row Else lineno = 0       '行数
  15. Application.Calculation = xlManual
  16. For i = 3 To lineno
  17. stat = Trim(Cells(i, 3))
  18. If stat = "Y" Or stat = "y" Then
  19. name = Cells(i, 2)
  20. field = Cells(i, 4)
  21. pn(1) = Cells(i, 5)
  22. pm(1) = Cells(i, 6)
  23. pn(2) = Cells(i, 7)
  24. pm(2) = Cells(i, 8)
  25. pn(3) = Cells(i, 9)
  26. pm(3) = Cells(i, 10)
  27. pn(4) = Cells(i, 11)
  28. pm(4) = Cells(i, 12)
  29. pmkk = Cells(i, 13)
  30. sqls = Cells(i, 15)
  31. 'MsgBox sqls
  32. For kk = 1 To pmkk  '用于参数多次使用,如联合SQL语句中每个子句都需要日期参数
  33. For j = 1 To 4
  34. If pn(j) <> "" Then
  35. sqls = Replace(sqls, "?", pm(j), 1, 1)
  36. 'MsgBox sqls
  37. End If
  38. Next j
  39. Next kk
  40. MsgBox sqls
  41. Set rst = cnn.Execute(sqls)
  42. sqls = "clear sheets"
  43. maxrow = Sheets(name).UsedRange.Rows.Count
  44. Sheets(name).Range("a2:" & field & maxrow).ClearContents
  45. sqls = "CopyFromRecordset"
  46. Sheets(name).Range("a2").CopyFromRecordset rst
  47. Cells(i, 3) = "成功"
  48. 'MsgBox i
  49. End If
  50. Next i
  51. 'rst.Close
  52. 'Set rst = Nothing
  53. cnn.Close
  54. Set cnn = Nothing
  55. Application.Calculation = xlAutomatic
  56. 'Sheets("分析").PivotTables("数据透视表1").PivotCache.Refresh
  57. Worksheets("系统参数").Select
  58. msg = MsgBox("数据读取完毕!", vbOKOnly, "iamlaosong")
  59. Exit Sub
  60. ErrMsg:
  61. OraOpen = False
  62. MsgBox sqls, vbCritical, "操作失败 ,请检查!"
  63. End Sub

3、SQL语句实例

这是一个简单的语句:

  1. SELECT *  FROM zdgc_sn_sj_gfl t
  2. WHERE t.CLCT_DATE = to_date('?', 'yyyy-mm-dd')
  3. AND t.JSBZ = '1'
  4. ORDER BY t.CITY, t.SSXS

这是一个复杂的语句:

  1. select aa.zj_code,
  2. aa.zj_mc,
  3. aa.clct_date,
  4. aa.sjzl,
  5. aa.jyqsjzl,
  6. nvl(bb.wgfsl, 0),
  7. nvl(bb.jyqwgfsl, 0)
  8. from (select b.ssxs,
  9. b.zj_code,
  10. b.zj_mc,
  11. a.clct_date,
  12. count(*) sjzl,
  13. sum(case
  14. when to_char(a.clct_time, 'hh24mi') <= '?' then
  15. 1
  16. else
  17. 0
  18. end) jyqsjzl
  19. from tb_evt_mail_clct a, sncn_zd_jg b
  20. where a.clct_bureau_org_code = b.zj_code
  21. and a.time_limit_code <> '6'
  22. and a.mail_kind_code <> '10401'
  23. and a.addi_service_code <> '1'
  24. and (a.rcv_area like '23%' or a.rcv_area like '24%')
  25. group by b.ssxs, b.zj_code, b.zj_mc, a.clct_date) aa
  26. left join (select b.ssxs,
  27. b.zj_code,
  28. b.zj_mc,
  29. a.clct_date,
  30. count(*) wgfsl,
  31. sum(decode(jybz, 'b', 1, 0)) jyqwgfsl
  32. from sncn_zd_jg b, zdgc_sn_sj_errfc a
  33. where a.zj_code = b.zj_code
  34. and a.jsbz = '1'
  35. and a.jybz = 'b'
  36. group by b.ssxs, b.zj_code, b.zj_mc, a.clct_date) bb on aa.ssxs =
  37. bb.ssxs
  38. and aa.zj_code =
  39. bb.zj_code
  40. and aa.clct_date =
  41. bb.clct_date
  42. where aa.clct_date = to_date('?', 'yyyy-mm-dd')
  43. and aa.ssxs = '?'
  44. order by aa.zj_code, aa.zj_mc

  4、操作界面

这是一个:

这是另一个:

  5、说明

1)使用者需要安装Oracle客户端并进行本地服务名配置(运行客户端程序Net Configuration Assistant配置,本例配置的服务名是DL580),实际就是配置tnsnames.ora文件。也可以安装简易oracle客户端,并用记事本修改tnsnames.ora文件,本例就是需要在该文件中增加如下内容(本例Oracle数据库服务器地址是10.178.10.197,SID是ORCL):

DL580 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.178.10.197)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

通过工作表保护使使用者只能修改参数值和状态,其他不能修改,防止破坏相关设置。

2)可以用循环实现参数的多次使用,这在SQL包含多个子查询,参数是日期的情况下很有用,每个子查询多会用到参数中的起止日期。循环中如果某个子查询只用到部分参数,可以用注释语句中加“?”的方式站位。例如:

  1. select b.city,
  2. b.ssxs,
  3. a.clct_bureau_org_code,
  4. b.zj_mc,
  5. a.sender_cust_code,
  6. a.sender_dept_name,
  7. min(a.clct_date),
  8. max(a.clct_date),
  9. count(*) yjzl,
  10. sum(a.actual_total_fee) yjsr
  11. from tb_evt_mail_clct a,
  12. (select * from sncn_zd_jg where jgfl = 'sd') b,
  13. (select distinct t.sender_cust_code
  14. from tb_evt_mail_clct t
  15. where t.clct_date < to_date('?', 'yyyy-mm-dd')) c
  16. -- ?  占位
  17. where a.clct_bureau_org_code = b.zj_code
  18. and a.clct_date between to_date('?', 'yyyy-mm-dd') and
  19. to_date('?', 'yyyy-mm-dd')
  20. and length(a.sender_cust_code) = 14
  21. and a.sender_cust_code = c.sender_cust_code(+)
  22. and c.sender_cust_code is null
  23. group by b.city,
  24. b.ssxs,
  25. a.clct_bureau_org_code,
  26. b.zj_mc,
  27. a.sender_cust_code,
  28. a.sender_dept_name
  29. order by b.city,
  30. b.ssxs,
  31. a.clct_bureau_org_code,
  32. b.zj_mc,
  33. a.sender_cust_code,
  34. a.sender_dept_name
 

附:简易客户端(版本9i)资源下载地址:http://download.csdn.net/detail/iamlaosong/5035733

       完整的工具包(含Oracle简易客户端资源下载地址:http://download.csdn.NET/detail/iamlaosong/5307186

利用ADO让普通人用excel读取oracle数据库表的通用办法的更多相关文章

  1. Excel生成Oracle数据库表sql工具类

    1.解决问题: 开发文档中字段比较多的时候,建表sql(Oracle下划线命名规范)比较麻烦,容易出错~~ (主要是懒) 特意手写一个工具,根据excel字段,生成建表的sql语句. ~~~末尾附Gi ...

  2. 用Excel导入Oracle数据库plsql

    打开plsql之后,在工具栏点击[tools]--[ODBC Imoprter] 选择导入文件的类型,这里是excel文件,所以选择Excel Files 输入连接数据库的用户名和密码 点击Conne ...

  3. cx_Oracle读取Oracle数据库中文乱码问题解决

    在使用cx_Oracle模块读取Oracle数据库中的中文记录时,返回值皆为?,后google得此佳文,遂问题得以解决,特此记之. Oracle数据库版本是10g,字符集是AL32UTF8. 编写的p ...

  4. Python+Pandas 读取Oracle数据库

    Python+Pandas 读取Oracle数据库 import pandas as pd from sqlalchemy import create_engine import cx_Oracle ...

  5. Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)

    转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...

  6. Excel 读取写入数据库

    // Excel 读取写入数据库 // 3.8版本的poi  4.0 可以不用写  parseCell  这个方法,可以直接赋值 STRING 类型 import org.apache.poi.hss ...

  7. Oracle 数据库表同步方法浅议

    总结一下Oracle数据库表级别的复制同步 一.通过触发器进行表的复制 原理,是监听表上都某一字段进行的DML操作,然后得到DML操作的数据,重新在另一个表上执行DML操作. 优点: 简单,编写一个触 ...

  8. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

  9. Java创建Oracle数据库表

    我们通常只用java执行DML(即:insert, update, delete, select)操作,很少用来执行DDL(create, drop, alert)操作.今天试了下如何用java来创建 ...

随机推荐

  1. [js高手之路]构造函数的基本特性与优缺点

    上文,通过基本的对象创建问题了解了构造函数,本文,我们接着上文继续了解构造函数的基本特性,以及优缺点. 每个对象上面都有一个constructor属性( 严格意义上来说,是原型上的,对象是通过查找到原 ...

  2. SQL中多条件查询括号的用途

    界面: 代码 0 posted @ 2009-12-15 13:28 唔愛吃蘋果 阅读(8640) 评论(0)  编辑 收藏

  3. 如何成为一个优秀的java程序员

    Java程序员有许多应遵循的守则或最佳实践方式.本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果. 1. 为代码添加注释(Add comments to your ...

  4. 【Spring 核心】AOP 面向切面编程

    一.什么是面向切面编程? 二.通过切点来选择连接点 三.使用注解创建切面 四.在XML中声明切面 五.注入AspectJ切面

  5. VMware Workstation 12 Player之安装林耐斯-Linux Red Hat 7 -系统

    Linux系统之Red Hat 7 安装笔记... Red Hat(红帽)公司(NYSE:RHT)是一家开源解决方案供应商,也是标准普尔500指数成员.总部位于美国北卡罗来纳州的罗利市,截止2015年 ...

  6. 关于IE浏览器的一些思路

    首先说说我对IE的看法: 第一感觉倔强.孤僻特立独行.(总是和别人不一样,是初学者的噩梦) 第二感觉个性(每个版本都需要你去用不同的代码去适配她) 虽然现在IE已经升级到了11相对于以前的IE8,IE ...

  7. Windows下JNI的使用教程

    JNI的使用大致有以下4个步骤: 一.在Java中写native方法 二.用javah命令生成C/C++头文件 三.写对应的C/C++程序实现头文件中声明的方法,并编译成库文件 四.在Java中加载这 ...

  8. 超简单使用批处理(batch)操作数据库

    超简单使用批处理(batch)操作数据库 批处理(batch)是什么 批处理的执行就好比快递员的工作: 未使用批处理的时候,快递员一次从分发点将一件快递发给客户: 使用批处理,则是快递员将所有要派送的 ...

  9. JDK安装与配置详细图文教程

    目的:本人健忘,以后难免会重装系统啥的,软件卸了装是常有的事,特此写此详细教程,一是方便自己以后重装的时候可以看看:二是如果有某位初学者有幸光临,也可以给一点参照.下面我会从JDK的下载.安装.环境变 ...

  10. spring boot / cloud (八) 使用RestTemplate来构建远程调用服务

    spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...