通过Oracle DB连接时调用表中的column_name

时间:2011-06-07 17:49:06

标签: ruby oracle tsql activerecord oci8

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

如果我使用索引号,我的代码可以正常工作。如行[1]但我 想要使用column_name“first 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的缺点,因为它将数据库中的表作为数组进行处理,这可能就是我们无法通过column_name指定的原因。

3 个答案:

答案 0 :(得分:2)

首先,你似乎对你正在使用的各种技术之间的界限和分离感到困惑。您提供的代码中没有Watir,没有。它是纯粹的Ruby和来自OCI8 Gem的一小部分东西。 GEM是Ruby人员用来分发用Ruby语言编写的代码库和程序的标准方法。有关详细信息,请参阅HERE以更好地了解Gem是什么以及如何使用它们。

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

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

请允许我强烈推荐,在您进一步深入了解当前项目之前,花一点时间学习一下Ruby语言。鉴于您似乎正在进行编码的性质,我建议您阅读Brian Marik的书“用Ruby编写日常脚本”,这样可以让您更好地理解您正在使用的技术,并且您将理解当我们像我刚才那样折腾像'hash'这样的术语时会更好。

如果您在如何与数据库连接方面提供一些一般性建议。恕我直言,您应该通过构建一个返回JUST您想要的数据的查询来利用数据库,而不是抓取大量数据并尝试手动解析它。它更好地利用资源,使用更少的内存,花费更少的时间从数据库传输信息,无论解析代码有多好,它都不会像Oracle人员写的那样好。让数据库完成繁重的工作,这就是它的用途。

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

因为它代表了所有验证功能或验证网站工作原理的测试代码是否会与从db中获取数据的大型单片紧密耦合。这会产生很多依赖关系并使您的测试代码难以维护。如果以更模块化的方式处理事物,每个验证步骤只检索它所需的数据,那么随着站点或数据库的更改,扩展或修改测试代码会容易得多。

答案 1 :(得分:0)

如果你有一个包含列名的数组,那么你可以用行数组压缩它并构建一个哈希:

Hash[column_names.zip( row )]

我建议使用activerecord。

答案 2 :(得分: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