Ruby-dbi-fetching-results

提供:Dev Guides
移動先:案内検索

読み取り操作のためのRuby DBIメソッド

DBIは、データベースからレコードを取得するためのいくつかの異なるメソッドを提供します。 dbh がデータベースハンドルであり、 sth がステートメントハンドルであると仮定します-

Sr.No. Methods with Description
1 *db.select_one( stmt, *bindvars ) = > aRow

nil*

事前にパラメーターマーカーに_bindvars_をバインドして_stmt_ステートメントを実行します。 結果セットが空の場合、最初の行または_nil_を返します。

2
*db.select_all( stmt, *bindvars ) ⇒ [aRow, …​]

nil*

  • db.select_all(stmt、* bindvars)\ {
aRow

ブロック } *

事前にパラメーターマーカーに_bindvars_をバインドして_stmt_ステートメントを実行します。 ブロックなしでこのメソッドを呼び出すと、すべての行を含む配列が返されます。 ブロックが与えられた場合、これは行ごとに呼び出されます。

3
  • sth.fetch ⇒ aRow

nil*

_next_行を返します。 結果セットにさらに行がない場合、_nil_を返します。

4
*sth.fetch \{ aRow

aBlock }*

結果セットの残りの行に対して指定されたブロックを呼び出します。

5

sth.fetch_all ⇒ [aRow, …​]

配列に収集された結果セットの残りのすべての行を返します。

6

sth.fetch_many( count ) ⇒ [aRow, …​]

[aRow、…​]配列に収集された次の_count_行を返します。

7
*sth.fetch_scroll( direction, offset=1 ) ⇒ aRow

nil*

_direction_パラメーターと_offset_で指定された行を返します。 パラメーター_offset_は、SQL_FETCH_ABSOLUTEおよびSQL_FETCH_RELATIVEを除くすべてについて破棄されます。 _direction_パラメーターの可能な値については、以下の表を参照してください。

8

sth.column_names ⇒ anArray

列の名前を返します。

9

column_info ⇒ [ aColumnInfo, …​ ]

DBI
ColumnInfoオブジェクトの配列を返します。 各オブジェクトには1つの列に関する情報が格納され、その名前、タイプ、精度などが含まれます。
10

sth.rows ⇒ rpc

実行されたステートメントの_Count_処理済み行を返します。存在しない場合は_nil_

11 *sth.fetchable? ⇒ true

false*

行をフェッチできる場合は_true_を返し、そうでない場合は_false_を返します。

12

sth.cancel

結果セットが保持しているリソースを解放します。 このメソッドを呼び出した後、再度_execute_を呼び出すまで行をフェッチできなくなります。

13

方向パラメーター

次の値は、_fetch_scroll_メソッドの方向パラメータに使用できます-

Sr.No. Constant & Description
1

DBI::SQL_FETCH_FIRST

最初の行をフェッチします。

2

DBI::SQL_FETCH_LAST

最後の行をフェッチします。

3

DBI::SQL_FETCH_NEXT

次の行をフェッチします。

4

DBI::SQL_FETCH_PRIOR

前の行をフェッチします。

5

DBI::SQL_FETCH_ABSOLUTE

位置オフセットで行をフェッチします。

6

DBI::SQL_FETCH_RELATIVE

現在の行からオフセットした行を取り出します。

次の例は、ステートメントのメタデータを取得する方法を示しています。 前の章で作成したEMPLOYEEテーブルを検討してください。

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?")
   sth.execute(1000)
   if sth.column_names.size == 0 then
      puts "Statement has no result set"
      printf "Number of rows affected: %d\n", sth.rows
   else
      puts "Statement has a result set"
      rows = sth.fetch_all
      printf "Number of rows: %d\n", rows.size
      printf "Number of columns: %d\n", sth.column_names.size
      sth.column_info.each_with_index do |info, i|
         printf "--- Column %d (%s) ---\n", i, info["name"]
         printf "sql_type:         %s\n", info["sql_type"]
         printf "type_name:        %s\n", info["type_name"]
         printf "precision:        %s\n", info["precision"]
         printf "scale:            %s\n", info["scale"]
         printf "nullable:         %s\n", info["nullable"]
         printf "indexed:          %s\n", info["indexed"]
         printf "primary:          %s\n", info["primary"]
         printf "unique:           %s\n", info["unique"]
         printf "mysql_type:       %s\n", info["mysql_type"]
         printf "mysql_type_name:  %s\n", info["mysql_type_name"]
         printf "mysql_length:     %s\n", info["mysql_length"]
         printf "mysql_max_length: %s\n", info["mysql_max_length"]
         printf "mysql_flags:      %s\n", info["mysql_flags"]
      end
   end
   sth.finish
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

これは、次の結果を生成します-

Statement has a result set
Number of rows: 5
Number of columns: 5
--- Column 0 (FIRST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 4
mysql_flags:      0
--- Column 1 (LAST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 5
mysql_flags:      0
--- Column 2 (AGE) ---
sql_type:         4
type_name:        INTEGER
precision:        11
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       3
mysql_type_name:  INT
mysql_length:     11
mysql_max_length: 2
mysql_flags:      32768
--- Column 3 (SEX) ---
sql_type:         12
type_name:        VARCHAR
precision:        1
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     1
mysql_max_length: 1
mysql_flags:      0
--- Column 4 (INCOME) ---
sql_type:         6
type_name:        FLOAT
precision:        12
scale:            31
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       4
mysql_type_name:  FLOAT
mysql_length:     12
mysql_max_length: 4
mysql_flags:      32768