执行了这两个 Ruby 脚本之后,您就具有了一个名为 STATES 的数据库表,其中填充了几个州。现在,假设您在一些州的首府上犯了一些典型错误,甚至弄混了一个州的缩写(用 MA 代表 Maine,实际上 MA 代表 Massachusetts)。
清单 3 显示了用以修复这些问题的简单 UPDATE 脚本。清单 3 用占位符更新州首府并直接更新 Maine 的错误缩写,而不使用任何占位符或任何类型的语句准备。
清单3:updateStatesTable.rb
require 'dbi'
dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')
sqlCapitalsUpdate = "UPDATE states SET capital = ? WHERE id = ?"
dbh.do(sqlCapitalsUpdate, "Montgomery", "AL")
dbh.do(sqlCapitalsUpdate, "Harrisburg", "PA")
dbh.do(sqlCapitalsUpdate, "Olympia", "WA")
dbh.do("UPDATE states SET id = 'ME' WHERE name = 'Maine'")
dbh.commit
dbh.disconnect
|
正如您希望的那样,DELETE 的执行方式与其同等的 DML 语句 INSERT 和 UPDATE 的执行方式非常类似。因此,您现在将转到一条 SELECT 语句,因为该语句添加了一个新技巧:数据库查询的结果集。
清单 4 演示如何在我们新填充的 STATES 表上执行一个简单查询。内置的 p 函数打印出返回的行,如图 5 所示。您可能已经使用内置的 puts 方法或 pp(“优化打印程序”)库来显示查询结果。清单 4 显示使用 # 指示有关打印查询结果的这两种方式的 Ruby 内联注释。
清单4:queryStatesTable.rb
require 'dbi'
dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')
rs = dbh.prepare('SELECT * FROM states')
rs.execute
while rsRow = rs.fetch do
p rsRow
#Alternative output: puts rsRow
#Alternative output: pp rsRow
end
rs.finish
dbh.disconnect
|
|
图5:查询结果 |
Ruby DBI 提供了更好的输出格式。清单 5 和 6 显示使用 DBI 分别以表格和 XML 格式输出相同的查询结果。清单 5 和 6 中的代码不仅显示了 DBI::Utils 输出格式功能的用法,还显示了与清单 4 略微不同的获取和操作结果集的方法。
清单5:queryStatesTableFormatter.rb
require 'dbi'
dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')
rs = dbh.execute('SELECT * FROM states')
rows = rs.fetch_all
column_names = rs.column_names
rs.finish
DBI::Utils::TableFormatter.ascii(column_names, rows)
dbh.disconnect
Listing 6: queryStatesTableXML.rb
require 'dbi'
dbh = DBI.connect('DBI:OCI8:ORCL', 'hr', 'hr')
rs = dbh.execute('SELECT * FROM states')
states_rows = rs.fetch_all
rs.finish
DBI::Utils::XMLFormatter.table(states_rows)
dbh.disconnect
|
图 6 和 7 分别显示了这些脚本产生的表格式输出和 XML 输出。
|
图6:查询结果的表格式输出 |
|
图7:XML 格式的查询结果 |