Ruby-dbi-fetching-results
読み取り操作のための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*
|
aRow |
ブロック } * 事前にパラメーターマーカーに_bindvars_をバインドして_stmt_ステートメントを実行します。 ブロックなしでこのメソッドを呼び出すと、すべての行を含む配列が返されます。 ブロックが与えられた場合、これは行ごとに呼び出されます。 |
3 |
|
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, … ]
|
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