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

Operação de leitura do DBI Ruby

O DBI oferece várias maneiras diferentes de obter registros do banco de dados. Supondo dbh dbhé um manipulador de banco de dados: sth

é um manipulador de instrução:número de série
1método & descrição *bindvars ) => aRow | nulo
executar com bindvars vinculado antes do marcador de parâmetro stmt instrução. Retorna a primeira linha, se o conjunto de resultados estiver vazio, retorna nulo
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nulo
db.select_all( stmt, *bindvars ){ |aRow| aBlock }

executar com bindvars vinculado antes do marcador de parâmetro stmt instrução. A chamada deste método sem bloco retorna um array contendo todas as linhas. Se um bloco for fornecido, o método será chamado para cada linha.
3sth.fetch => aRow | nulo
retornaa próxima linha. Se não houver próxima linha no conjunto de resultados, retorna nulo
4sth.fetch { |aRow| aBlock }
chama o bloco fornecido para as linhas restantes do conjunto de resultados.
5sth.fetch_all => [aRow, ...]
retorna todas as linhas restantes do conjunto de resultados armazenadas no array.
6sth.fetch_many( count ) => [aRow, ...]
retorna a linha para baixo na array [aRow, ...] count linha.
7sth.fetch_scroll( direction, offset=1 ) => aRow | nulo
retorna direction e offset a linha especificada. Exceto para SQL_FETCH_ABSOLUTE e SQL_FETCH_RELATIVE, outras métodos descartam os parâmetros offsetdirection valores possíveis do parâmetro, consulte a tabela abaixo.
8sth.column_names => anArray
retorna o nome da coluna
9column_info => [ aColumnInfo, ... ]
retorna um array de objetos ColumnInfo DBI. Cada objeto armazena informações sobre uma coluna, incluindo o nome, tipo, precisão e outras informações adicionais.
10sth.rows => rpc
retorna o número de linhas tratadas pela instrução de execução Countse não existir, retorna nulo
11sth.fetchable? => verdadeiro | falso
se possível obter linhas, retorna verdadeirocaso contrário, retorna falso
12sth.cancel
liberar os recursos ocupados pelo conjunto de resultados. Após a chamada deste método, você não pode obter mais linhas, a menos que chame novamente execute
13sth.finish
Libere os recursos ocupados pela declaração preparada. Após a chamada deste método, você não pode chamar outros métodos de operação adicional no objeto.

parâmetro direction

Os seguintes valores podem ser usados fetch_scroll O parâmetro de método direction:

ConstanteDescrição
DBI::SQL_FETCH_FIRSTObter a primeira linha.
DBI::SQL_FETCH_LASTObter a última linha.
DBI::SQL_FETCH_NEXTObter a próxima linha.
DBI::SQL_FETCH_PRIORObter a linha anterior.
DBI::SQL_FETCH_ABSOLUTEObter a linha no local de deslocamento.
DBI::SQL_FETCH_RELATIVEObter a linha de deslocamento atual em relação à linha atual.

Exemplo Online

O exemplo a seguir demonstra como obter os metadados de uma instrução. Suponha que temos a tabela EMPLOYEE.

#!/usr/bin/ruby -w
require "dbi"
begin
     # Conectando ao servidor 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 "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
     # 断开与服务器的连接
     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
--- Coluna 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
--- Coluna 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
--- Coluna 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
--- Coluna 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