提数据应用场景 - noradle/noradle-doc GitHub Wiki

背景

从 oracle 中提取数据是信息化部门经常的工作, 常常使用的方式是用通过sqlplus脚本将sql/plsql执行输出写到spool指令指定的文件中。 然而 sqlplus 并不是一个可编程的脚本环境, sql输出的格式也非常有限,不能生成复杂和灵活的格式。 现在,需要简单的方式,不引入数据库之外的环境和语言, 就可以解决这个问题。

像 noradle 动态网页一样导出数据

noradle 考虑同使用 pl/sql 生成页面一样, 从数据库库表数据生成符合格式要求的输出, 虽然说是数据提取应用场景, 但是技术上是完全一样的, 同传统客户端环境连接数据库抓数据输入的方式不同, 整个执行环境在 oracle database 内部,由 pl/sql 程序生成, 因此需要使用 http 方式下载 plsql server page 页面即可, 在 nix 环境下,通过 wget/curl 都可以非常方便的下载, 也可以通过浏览器的另存为保存。

  wget|curl    |       noradle           目标存储过程
   浏览器       |------>  http   ----> (取数据按要求的格式输出)
其他http下载工具 |        接入通道

优势

通过 http 访问

  • 使用任何Http客户端下载导出数据
  • 可以利用http的压缩
  • 交付导出URL代替导出数据,制作导出代码者和最终数据需求者分离,最终数据需求者可以随时重新访问导出url获取更新的导出数据

通过存储过程执行

导出程序位于数据库内部, 因此所有的导出工作形成的代码都被集中的很好的保存了, 非常的方便其他人使用, 也方便自己以后重用。

完全可编程、灵活

通过plsql代码,可以提取任何表的数据,按照任何想要的格式输出。 可以进行提数据的认证和审计,性能的记录和评估。 但是又无需使用 java 等数据库外的语言和配置客户端访问等额外的麻烦, 也不像 sqlplus 环境没有编程环境,无法进行灵活的逻辑控制和格式控制。

控制和管理

限制导出程序的执行

因为要通过http访问指定url来访问用于生成导出数据的plsql servlet存储过程, 这种导出往往涉及到的数据量比较大,输出量也比较大, 因此要防范导出程序被非正常业务需要的访问,这就需要增加控制。 控制策略根据需求往往有几类。

  • 认证控制:只有对的人可以执行导出servlet
  • 时间段控制:只有在系统不忙的时候允许执行导出操作
  • 总并发控制:所有的导出只分配一定数量的并发,防止对正常高可用类的服务产生资源竞争
  • 次数控制:一定周期内,导出次数有限

导出程序命名规范

存储过程对象名称为 exp_xxx_h,可以保证和其他类型的存储过程区分。

导出日志

在前后过滤器中记录所有的导出操作,包括:

  • 存储过程名称
  • 参数
  • 执行是否成功
  • 执行开始时间
  • 执行多长时间
  • 产生多大的输出

这样可以对明了所有的数据导出工作,各类导出所产生的压力。