Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90985442
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-22 17:37:28

来源:

Ruby 提供了一些对于编写和维护脚本非常有用的全局常数。图 3 显示了其中某些正在运行的预定义全局常数。这三个全局常数指明了这个特定 Ruby 解释器的底层平台、版本和发布日期。此处并未显示,但您还可以利用另一个预定义的全局常数 ENV 查看操作系统中设置的环境变量。在本文后面,您还将了解如何使用散列版本的 ENV。

图3:有用的 Ruby 常数

图 4 显示了交互式 Ruby 的另一个非常有用的特性。您在该图中看不到单击 TAB 键的操作,因此只能相信我的话:在 IRB 提示符处输入 0,后面跟一个句点,然后单击 TAB 键两次。然后,系统会显示针对 0 或其他数值的方法。可将这看作与 Java 集成开发环境 (IDE)(如 JDeveloper)中的方法名称完成类似。您会看到针对数字的 ceiling (ceil)、floor 以及 round 方法以及转换方法,如 to_s(转换成字符串)和 to_a(转换成数组)。

图4:Ruby IRB tab 完成

Ruby 与 Oracle 数据库交互

为了使 Ruby 能够与我们的 Oracle 数据库通信,需要使用 Ruby/OCI8。可从 获得。尽管我们可以用交互式 IRB 编写自己的 Ruby 代码来访问数据库,但这种方法比较费事。较好的方法是:将我们的数据库访问代码编写成一个 Ruby 脚本文件,然后用 ruby 解释器命令运行该 Ruby 脚本文件。

Ruby 与 Oracle DDL SQL。 我们首先创建一个用于创建新表的 Ruby 脚本文件。我们需要声明与 Ruby/DBI 结合使用的是一个 require 语句,然后使用 Ruby/DBI API。清单 1 显示以上内容和 CREATE 语句。

清单1:createStatesTable.rb

require 'dbi'

dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')

dbh.do("CREATE TABLE states (

id CHAR(2) PRIMARY KEY,

name VARCHAR2(15) NOT NULL,

capital VARCHAR2(25) NOT NULL)")

dbh.disconnect

清单 1 中的大多数代码都是您在 SQL*Plus 或 SQL Developer 中用于创建一个新数据库表的 SQL 代码。数据库连接字符串包括 DBI:OCI8:ORCL 字符串以及用户名和口令(本示例中为 hr/hr)。DBI 部分是标准内容,OCI8 部分指的是 Ruby/OCI8 驱动程序,ORCL 部分指的是数据库服务。可以使用简单的 createStatesTable.rb 命令在命令行执行这个 createStatesTable.rb 文件。如果一切顺利,则不会提供任何反馈,但该表将处于 HR 模式中。

继续介绍 Ruby 的其他数据库操作之前,需要指出 ruby 解释器命令允许您检查脚本的语法而无需实际运行它。例如,如果要测试 createStatesTable.rb 脚本中的语法而不实际创建该表,我可以使用 -c 选项,如下: ruby -c createStatesTable.rb.

清单 1 中与 Ruby 有关的另一件有趣的事情是未定义变量 dbh 的数据类型。与其他动态脚本编写语言一样,Ruby 不需要声明变量的数据类型,而是根据变量的上下文来假定所需的数据类型。在其余的 Ruby 代码清单中,我们将看到更多这样的“动态类型 (duck typing)”— 如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子。

Ruby 与 Oracle DML SQL。 创建了一个 STATES 表之后,我们来填充它。我们将向该表中插入几个代表性的州名,如清单 2 所示。

清单2:populateStatesTable.rb

require 'dbi'

dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')

sqlInsert = "INSERT INTO states (id, name, capital)

VALUES (?, ?, ?)"

dbh.do(sqlInsert, "AL", "Alabama", "Birmingham")

dbh.do(sqlInsert, "AZ", "Arizona", "Phoenix")

dbh.do(sqlInsert, "CO", "Colorado", "Denver")

dbh.do(sqlInsert, "FL", "Florida", "Tallahassee")

dbh.do(sqlInsert, "MA", "Maine", "Augusta")

dbh.do(sqlInsert, "PA", "Pennsylvania", "Philadelphia")

dbh.do(sqlInsert, "UT", "Utah", "Salt Lake City")

dbh.do(sqlInsert, "WA", "Washington", "Seattle")

dbh.do(sqlInsert, "WY", "Wyoming", "Cheyenne")

dbh.commit

dbh.disconnect

清单 2 中有一些需要了解的 Ruby/DBI 新特性。首先,注意问号在 INSERT 语句中用作占位符。这很有用,因为它允许创建该语句一次,然后针对插入到表中的每个代表性州名进行填充。由于 INSERT 语句是一个 DML 语句(与清单 1 中的 DDL CREATE 语句不同),因此在该清单中还需要一个 COMMIT 调用。

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~