Ruby DBI Read operation
DBI provides several different ways to get records from a database. Hypothetical dbh
is a database handle sth
is a statement handle:
Serial number |
Method and description |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
Sth.cancel frees the resources occupied by the result set. After calling this method, you can no longer get the row unless you call execute again. |
13 |
|
Direction parameter
The following values can be used for fetch_scroll
method of direction
parameters:
Constant |
Description |
---|---|
DBI::SQL_FETCH_FIRST |
Get the first line. |
DBI::SQL_FETCH_LAST |
Gets the last line. |
DBI::SQL_FETCH_NEXT |
Gets the next line. |
DBI::SQL_FETCH_PRIOR |
Gets the previous line. |
DBI::SQL_FETCH_ABSOLUTE |
Gets the row at the offset at this location. |
DBI::SQL_FETCH_RELATIVE |
Gets the row from the offset of the current row. |
Example
The following example shows how to get the metadata of a statement. Suppose we have EMPLOYEE
watch.
#!/usr/bin/ruby -w
require "dbi"
begin
# Connect to 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
# server disconnect
dbh.disconnect if dbh
end
This will produce the following results:
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