-1

Oracle データベースを介して接続しているテーブル (従業員) から値を取得しようとしています。1 つの列に数百の値があるため、テーブルを反復処理して正確な値を取得する必要があります。

インデックス番号を使用すると機能するコードがあります。row[1] などですが、row[1] の代わりに column_name の「名」を使用したかったのです。以下は、私が持っているコードです。コード:

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 テーブルの変数を行 [5]、行 [24] のように定義していますが、これは機能しますが、非常に多忙で時間がかかります。したがって、すべての column_name のインデックスを見つけるのではなく、行と row['Emp_id'] などの列から値を取得するように column_name を使用する方法またはコマンドがあるかどうか疑問に思っていました。

これが Ruby の欠点であるかどうかはわかりません。データベースのテーブルを配列として扱い、それが column_name で指定できない理由かもしれません。

4

3 に答える 3

2

まず、使用しているさまざまなテクノロジー間の境界と分離に少し混乱しているようです。あなたが提供したコードには Watir はありません。それはすべて純粋な Ruby であり、OCI8 Gem のほんの一部です。GEM は、Ruby 言語で書かれたコード ライブラリとプログラムを配布するために Ruby の人々が使用する標準的な方法です。Gem とは何か、および Gem がどのように使用されるかをよりよく理解するための詳細については、こちらを参照してください。

Watir は Web ブラウザーを駆動するためのもう 1 つの Ruby gem であり、コードの他の場所で使用している可能性がありますが、この質問や OCI8 とは関係ありませんが、どちらも Gem として配布される Ruby コード ライブラリです。ですから、混乱しないように脇に置きましょう。

表示されている動作は OCI8 gem の動作であり、特に Ruby とは関係ありません。よりエレガントなものが必要な場合は、別の回答で既に提案されている ActiveRecord など、Ruby で db アクセスを行うために作成されたさまざまな gem を調べてください。OCI8 Gem は、現在のコードのように結果をブロックにフィードする場合にのみ配列を返します。それ以外の場合、結果は Cursor と呼ばれるオブジェクトにあり、カーソルの fetch_hash メソッドを使用してフェッチされたデータをハッシュとして取得できます。ハッシュ キーは列名です。( http://ruby-oci8.rubyforge.org/en/api_OCI8Cursor.htmlを参照)

現在のプロジェクトをさらに掘り下げる前に、Ruby 言語についてもう少し学習することに少し時間を費やすことを強くお勧めします。あなたが行っていると思われるコーディングの性質を考えると、Brian Marik の著書「Everyday Scripting with Ruby」を読むことをお勧めします。これにより、使用しているテクノロジーをよりよく理解できるようになります。先ほど行ったように、「ハッシュ」などの用語を使い回した方がよいでしょう。

データベースとの接続方法に関して、一般的なアドバイスを少しお許しいただければ幸いです。IMHO、膨大な量のデータを取得して手動で解析しようとするのではなく、必要なデータだけを返すクエリを作成することで、db を利用する必要があります。リソースをより有効に活用し、メモリの使用量を減らし、データベースから情報を転送するのにかかる時間を短縮します。解析コードがどれほど優れていても、Oracle の人々が書いたものほど良くはありません。面倒な作業はデータベースに任せてください。それがその目的です。

ここで扱っているのが、1 つの巨大なモノリシック アレイを構築するのではなく、テストを推進したり、結果を検証したりするためのデータである場合は、よりモジュラーなアプローチを使用することをお勧めします。テスト対象の現在のユーザーの EMP_ID などの 1 つのグローバル変数を使用し、各検証に必要な値のみ、またはアドレスの一部などの検証の小さな論理グループのクエリ結果をテスト コードに取得させます。データ取得ビット全体を 1 つの巨大な部分に書き込んで維持するのは悪夢になるのではなく、ケースバイケースで作業しながらそのように構築する方がはるかに簡単です。

現状では、機能を検証したり、サイトがどのように機能するかを検証したりするすべてのテスト コードは、データベースからデータをフェッチする大きなモノリシック部分に緊密に結合されます。これにより、多くの依存関係が作成され、テスト コードの保守が難しくなります。各検証ステップが必要なデータのみを取得する、よりモジュール化された方法で処理する場合、サイトまたはデータベースの変更に応じてテスト コードを拡張または変更するのがはるかに簡単になります。

于 2011-06-08T00:57:50.537 に答える
0

列名を含む配列がある場合は、行配列で圧縮してハッシュを作成できます。

Hash[column_names.zip( row )]

ただし、これにはactiverecordを使用することをお勧めします。

于 2011-06-07T18:53:35.707 に答える