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
[code language=”ruby”]
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 # Отключаемся
[/code]
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).