-1

我正在尝试从通过 oracle 数据库连接的表(员工)中获取值。由于一列中有 100 个值,我需要迭代表并获得确切的值。

如果我使用索引号,我有有效的代码。例如row[1],但我想使用column_name“名字”而不是row[1]。下面是我拥有的代码。代码:

def load_borrower

connection = OCI8.new('usrname', 'pwd', //host:portno/sid') 

connection.exec(("SELECT BI_PREFIX, BI_FNAME, BI_MNAME, BI_LNAME, B.BI_SUFFIX, BI_ID_TYPE, BI_ID_NUMBER, BI_DOB,    B1.*, R.*, M.*, C.*, L.* FROM EMPLOYEE, SC_BORROWERPREF_NEW S1, BORROWER_NEW B, BORROWERPREF_NEW B1, RES_ADD R, MAIL_ADD M, CLOS_ADD C, LLORD_ADD L WHERE S2=SCENARIO_ID = S1.SCENARIO_ID AND S1.PREF_ID = B1.PREF_ID AND B1.BORROWER_ID = B.BORROWER_ID AND B1.PREF_ID = R.RES_PREF_ID AND B1.PREF_ID = M.MAIL_PREF_ID AND B1.PREF_ID = C.CLOS_PREF_ID AND B1.PREF_ID = L.LLORD_PREF_ID  AND S.RELEASE_ID= "1" AND S.SCENARIO_NO = '2' ORDER BY S1.SC_BORROWERPREF_ID") do |row|

$BI_PREFIX=row[0].to_s

$BI_FNAME=row[1].to_s

$BI_MNAME=row[2].to_s

$BI_LNAME=row[3].to_s

$BI_SUFFIX=row[4].to_s

$BI_BI_ID_TYPE=row[5].to_s

$BI_BI_ID_NUMBER=row[6].to_s

$BI_DOB=row[7].to_s

$BI_EMAIL=row[9].to_s

$BI_CELL_PH=row[11].to_s

$BI_WORK_PH=row[12].to_s

$BI_PREF_CONT=row[13].to_s

$BI_MAR_STATUS=row[16].to_s

$BI_EMP_STATUS=row[23].to_s

$BI_EDUC_YEARS=row[17].to_s

$BI_NUM_DEPEND=row[21].to_s

end

end

现在我在下面运行上述功能

load_borrower

所以上面的代码现在可以正常工作了。但正如您从上面看到的,我将 db 表中的变量定义为 row[5]、row[24],尽管它可以工作,但它非常忙碌且耗时。所以我只是想知道我们是否有任何方法或命令来使用 column_name 以便它从行和列中获取值,例如 row['Emp_id'] 而不是查找每个 column_name 的索引。

我不确定这是否是 Ruby 的一个缺点,因为它将 db 中的表视为一个数组,这可能就是我们不能通过 column_name 指定的原因。

4

3 回答 3

2

首先,您似乎对所使用的各种技术之间的界限和分离感到有些困惑。您提供的代码中没有 Watir,没有。这都是纯 Ruby 和 OCI8 Gem 中的一小部分内容。GEM 是 Ruby 人员用来分发以 Ruby 语言编写的代码库和程序的标准方式。请参阅此处了解更多信息,以更好地了解宝石是什么以及如何使用它们。

Watir 是另一个用于驱动 Web 浏览器的 Ruby gem,您可能会在代码的其他地方使用它,但它与这个问题或 OCI8 无关,除了它们都是作为 Gems 分发的 Ruby 代码库。所以让我们把它放在一边,以免混淆。

您看到的行为是 OCI8 gem 的工作方式,与 Ruby 没有任何关系。如果您想要更优雅的东西,请查看为使用 Ruby 进行数据库访问而创建的不同 gem,例如 ActiveRecord,这已经在另一个答案中提出。如果您像在当前代码中那样将结果输入到块中,OCI8 Gem 只会返回一个数组。否则,结果在一个称为 Cursor 的对象中,您可以使用游标的 fetch_hash 方法将获取的数据作为 Hash 获取。哈希键是列名。(见http://ruby-oci8.rubyforge.org/en/api_OCI8Cursor.html

请允许我强烈建议您在深入了解当前项目之前花一点时间了解更多关于 Ruby 语言的知识。鉴于您似乎正在做的编码的性质,我建议您阅读 Brian Marik 的书“使用 Ruby 编写日常脚本”,这将使您更好地了解您正在使用的技术,并且您会理解当我们像我刚才那样折腾像“哈希”这样的术语时会更好。

如果您允许就如何与数据库进行交互提供一些一般性建议。恕我直言,您应该通过构建一个只返回您想要的数据的查询来利用数据库,而不是获取大量数据并尝试手动解析它。更好地利用资源,使用更少的内存,从数据库传输信息所需的时间更少,而且无论您的解析代码多么好,它都不会像 Oracle 人写的那样好。让数据库做繁重的工作,这就是它的用途。

如果您在这里处理的是驱动测试或验证结果的数据,而不是构建一个巨大的整体阵列,我建议您使用更加模块化的方法。使用一个全局变量,例如您正在测试的当前用户的 EMP_ID,并让测试代码获取每个验证所需的值的查询结果,或一小部分逻辑验证组(如地址的一部分)。以这种方式根据具体情况构建东西要容易得多,而不是尝试将整个数据检索位写入一个巨大的片段中,这将是一场噩梦。

就目前而言,所有验证功能或验证站点工作方式的测试代码都将紧密耦合到从数据库中获取数据的大型单片机。这会创建很多依赖项并使您的测试代码难以维护。如果您以更模块化的方式处理事情,每个验证步骤只检索它需要的数据,那么随着站点或数据库的变化,扩展或修改您的测试代码会容易得多。

于 2011-06-08T00:57:50.537 回答
0

如果您有一个包含列名的数组,那么您可以将其与行数组一起压缩并构建一个哈希:

Hash[column_names.zip( row )]

不过,我建议为此使用 activerecord。

于 2011-06-07T18:53:35.707 回答
0

这应该工作

connection = OCI8.new('usrname', 'pwd', //host:portno/sid') 

cursor = connection.exec(("SELECT BI_PREFIX ...")
cols = cursor.get_col_names

while r = cursor.fetch
  $BI_PREFIX=r[cols.index('BI_PREFIX')].to_s
  ...
end
于 2014-12-12T18:00:39.343 回答