English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby DBI Read 작업

DBI는 데이터베이스에서 레코드를 가져오는 다양한 방법을 제공합니다. 가정하면 dbh 는 데이터베이스 핸들입니다:sth 는 문장 핸들입니다:

순번메서드 및 설명
1db.select_one( stmt, *bindvars ) => aRow | nil
가진 bindvars 파라미터 태그 앞에 바인딩된 stmt 문장. 결과 집합이 비어 있으면 반환 nil
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil
db.select_all( stmt, *bindvars ){ |aRow| aBlock }

가진 bindvars 파라미터 태그 앞에 바인딩된 stmt 문장. 블록을 포함하지 않은 이 메서드를 호출하면 모든 행을 포함한 배열을 반환합니다. 블록이 주어지면 각 행에 대해 이 메서드가 호출됩니다.
3sth.fetch => aRow | nil
반환다음 행데이터가 없으면 반환 nil
4sth.fetch { |aRow| aBlock }
주어진 블록을 결과 집합의 남은 행에 대해 호출합니다.
5sth.fetch_all => [aRow, ...]
배열에 저장된 결과 집합의 모든 남은 행을 반환
6sth.fetch_many( count ) => [aRow, ...]
배열 [aRow, ...]에 저장된 아래 행을 반환 count 행.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
반환 direction 매개변수와 offset 지정된 행. SQL_FETCH_ABSOLUTE와 SQL_FETCH_RELATIVE를 제외한 다른 메서드는 매개변수를 버립니다. offsetdirection 가능한 매개변수 값은 아래 표를 참조하십시오.
8sth.column_names => anArray
열의 이름을 반환
9column_info => [ aColumnInfo, ... ]
DBI::ColumnInfo 객체의 배열을 반환합니다. 각 객체는 특정 열에 대한 정보를 저장하고, 열의 이름, 타입, 정밀도 등 추가 정보를 포함합니다.
10sth.rows => rpc
실행 문장이 처리한 행 수를 반환 Count없으면 반환 nil
11sth.fetchable? => true | false
행을 얻을 수 있다면 반환 true아니면 반환 false
12sth.cancel
자원을 소유하는 결과 집합을 해제합니다. 이 메서드를 호출한 후에는 행을 얻을 수 없으며, 다시 호출하지 않으면 됩니다. execute
13sth.finish
준비 문장이 사용하는 자원을 해제합니다. 이 메서드를 호출한 후에는 대상 객체에서 다른 추가 작업 메서드를 호출할 수 없습니다.

direction 매개변수

다음 값이 사용될 수 있습니다. fetch_scroll 메서드의 direction 매개변수:

상수설명
DBI::SQL_FETCH_FIRST첫 번째 행을 가져옵니다.
DBI::SQL_FETCH_LAST마지막 행을 가져옵니다.
DBI::SQL_FETCH_NEXT다음 행을 가져옵니다.
DBI::SQL_FETCH_PRIOR이전 행을 가져옵니다.
DBI::SQL_FETCH_ABSOLUTE위치에서 이 위치까지의 행을 가져옵니다.
DBI::SQL_FETCH_RELATIVE현재 행에서 이 위치까지의 행을 가져옵니다.

온라인 예제

아래의 예제는 문장의 메타데이터를 얻는 방법을 보여줍니다. EMPLOYEE 테이블이 있다고 가정합니다.

#!/usr/bin/ruby -w
require "dbi"
begin
     # 연결을 MySQL 서버에
     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 "문장이 결과 집합을 가지지 않음"
        printf "영향을 받은 행 수: %d\n", sth.rows
     else
        puts "문장이 결과 집합을 가짐"
        rows = sth.fetch_all
        printf "행 수: %d\n", rows.size
        printf "칼럼 수: %d\n", sth.column_names.size
        sth.column_info.each_with_index do |info, i|
          printf ""--- 칼럼 %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
     # 断开与服务器的连接
     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
--- 칼럼 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
--- 칼럼 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
--- 칼럼 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
--- 칼럼 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