Ruby: gem oci8 для работы с БД Oracle

INSTALL

Gem oci8 как в Ubuntu, так и в Gentoo использует oracle instantclient для работы, поэтому сначала нужно поставить его. Полностью процесс установки gem описан тут.

После установки instantclient устанавливаем уже расширение:

  • Установка Ubuntu требует обязательное определение переменной LD_LIBRARY_PATH.
~$ sudo env LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib gem install ruby-oci8
Building native extensions.  This could take a while...
Successfully installed ruby-oci8-2.2.1
1 gem installed
Installing ri documentation for ruby-oci8-2.2.1...
Installing RDoc documentation for ruby-oci8-2.2.1...
  • Установка Gentoo проходила без проблем простым emerge.

Если при использовании выдает:

ocidatetime.c:119:in oci8lib_220.so: ORA-01805: possible error in date/time operation (OCIError)

Помогает (добавить до cursor.exec):

OCI8::BindType::Mapping[Time] = OCI8::BindType::LocalTime
OCI8::BindType::Mapping[:date] = OCI8::BindType::LocalTime
USAGE
require 'oci8'

def db_ora_con
    OCI8.new('<user>','<pass>','<SID>')
end

def get_addr(conn)
    res = []
    conn.exec("select U_NAME
                ,U_CITY
                ,U_STREET
                ,U_HOUSE
              from ABTB do |r| res << r; end
    return res
end

conn_ora = db_ora_con # Подключаемся
addr_info = get_addr(conn_ora) # Получаем результат в виде array в array
conn_ora.logoff # Отключаемся
JOIN в SELECT

В примере по выгрузке данным из Oracle используют join по “;” для объединения элементов одной строки в результате select чтобы получить массив, в котором каждый новый элемент представлял собой строку из результата.

Как по мне так делать не нужно по двум причинам:

1. будет беда если в данных окажется ваш разделитель “;” который вы использовали для join. В результате вы можете получить кучу боли.

do |r| res << r.join(';'); end

2. Если вам понадобится, а вам наверняка понадобится, не просто же так вы данные выгружали, работать с этими данными – вам придется делать split, что само по себе костыль, хоть и в ruby это делается простой точкой.

Поэтому, как по мне, намного надежнее и проще работать с двумерным массивом (массив и в нем каждый новый массив – новая строка из результата select).

do |r| res << r; end
Разное

0.178766998E9  – при аналогичных запросах в PHP и ruby в выводе php нет конвертации числа в форму 0.<число>E9 (количество разрядов), а в ruby есть. Если это ненужно – решается простой конвертацией в char при запросе. Вместо select t.id пишем select to_char(t.id).

Leave a Reply