2017-10-13 17:20:43

Node.js + oracledb на Ubuntu

JavaScript Oracle Linux

Начнем с того, что у нас есть уже установленный Oracle Instant Client и SDK на Ubuntu, процесс его установки описывать не буду тк все это давно описано. Итак, мы хотим подружить наш новомодный Node.js с ораклом. Для этого нам потребуется фирменный node-oracledb - a Node.js driver for Oracle Database.

Скорее всего команда

npm install oracledb

закончится ошибкой, потому, что как обычно это бывает с ораклом, не хватает переменных окружения. В моем случае Oracle Instant Client установлен в /opt/Oracle/instantclient_11_2, поэтому все буду описывать относительного этого пути. SDK расположен в /opt/Oracle/instantclient_11_2/sdk.

Идем в /etc/profile.d/oracle.sh, который вы создали при установке клиента, и добавляем в него OCI_LIB_DIR и OCI_INC_DIR, таки образом, чтоб получилось что-то вроде моего:

export PATH=/opt/Oracle/instantclient_11_2:$PATH
export LD_LIBRARY_PATH=/opt/Oracle/instantclient_11_2:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.UTF8
export ORACLE_HOME=/opt/Oracle/instantclient_11_2
export TNS_ADMIN=/opt/Oracle
export SQLPATH=/opt/Oracle/instantclient_11_2
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include

Так же можно прописать нужные переменные в /root/.bashrc для того, чтоб они были доступны под суперпользователем.

Читать дальше...

2016-09-02 15:12:03

Oracle Client вместе с PHP-FPM

PHP Oracle Linux

PHP-FPM

Достаточно часто встречается связка Nginx + PHP-FPM, которая заменяет собой привычный многим Apache + mod_php. А когда требуется добавить возможность работать с Oracle из PHP, то не подготовленный человек, а точнее привычный к настройке Oracle Client для PHP, работающего как модуль Apache, может столкнуться с непредвиденными проблемами, о решении которых я попробую рассказать.

Итак, у нас CentOS (в принципе на других Linux все будет аналогично) на который уже установлен Nginx, PHP, PHP-FPM и Oarcle Client + модуль php_oci8. На всякий случай, в этом можно убедиться командой:

# php -m | grep oci

Если вывод такой же, как в примере ниже, то модуль установлен:

# php -m | grep oci
oci8

А вот если, там ругань об отсутствующей библиотеке вроде:

PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/lib/php/20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/oci8.so.so (/usr/lib/php/20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

То надо сделать (замените путь из примера на свой):

# echo /u01/app/oracle/product/12.1.02/db_1/lib > /etc/ld.so.conf.d/oracle.conf
# ldconfig

* в случае Oracle Instant Client путь будет до папки клиента, например /opt/oracle/instantclient_12_2.

Теперь модуль должен нормально заработать в консольном режиме.

Но после этого все равно при попытке использовать oci_connect(...) получаем вот такую ошибку в ответе от сервера:

Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories in /var/www/...

Когда все известные бубны с прописыванием ORACLE_HOME и LD_LIBRARY_PATH во все скрипты запуска и прочие перебраны, но все равно не работает, то простое решение кажется просто невозможным, но оно есть!

Читать дальше...

2016-02-09 15:28:52

Установка Oracle Client на Mac OS

PHP Oracle Mac OS

В продолжение темы про установку Oracle Client на Windows расскажу про свой опыт установки аналогичной связки для Mac OS.

На старте имеем Mac OS X 10.10 Yosemite в которой уже работает штатный web сервер apache и php 5.4. Цель первая - получить рабочий Oracle Client, иметь возможность работать с Oracle через Toad (да да, для мака есть тоад, и он бесплатный). Цель вторая - иметь возможность работать с Oracle из PHP.

Для начала качаем Oracle Instant Client для Mac OS с сайта oracle.com (там нужно регистрироваться):

  • instantclient-basic-macos.x64-11.2.0.4.0.zip (обязательно)
  • instantclient-sqlplus-macos.x64-11.2.0.4.0.zip (если хотим проверить, а тоад ставить нет планов)
  • instantclient-sdk-macos.x64-11.2.0.4.0.zip (если планируем использовать в PHP)

* я для себя выбрал 11-ю версию для того чтоб иметь возможность работы со старыми БД, например 9-й версии.

Распаковываем содержимое архивов в удобное место, для меня это /Library/Oracle. Возможны и другие варианты, но для меня более логично показалось так, далее все описания будут производиться относительно этого пути.

В результате получаем вот такую структуру папок:

/Library/Oracle/instantclient_11_2
/Library/Oracle/instantclient_11_2/sdk (если решили с SDK)

Далее создаем линки:

cd /Library/Oracle/instantclient_11_2
ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libocci.dylib.11.1 libocci.dylib.dylib

Читать дальше...

2011-03-15 19:55:52

Установка Oracle Client под Windows

Oracle Windows

Применимо для Windows XP x32 (Oracle Client Basic 10.2.0.4 + ODBC) и для Windows 7 x64 (Oracle Client Basic 11.1.0.6.0 x32).

В связи с участившимися вопросами "как ставить oracle client" опубликую что-то вроде инструкции из собственного опыта.

Первым делом нужно обзавестись самим клиентом, его можно скачать с сайта Oracle или еще где-то. Понадобится

  • instantclient-basic-win32-XXXX.zip
  • instantclient-odbc-win32-XXXX.zip (если требуется чтобы драйвер Oracle появился в Панель управления → Источники данных (ODBC))

Для работы PHP OCI8 и TOAD вполне будет достаточно только архива instantclient-basic. Приступим.

Читать дальше...

2008-10-06 14:57:58

Вытаскиваем из оракла данные по периоду

Про работу В мемориз Oracle

В связи с появлением проблемы 6-го дня (см. предыдущий пост) вытащить период (данные за определенный промежуток вермени с шагом например в день), у которого есть дата начала и дата конца, средствами php становится невозможно, поэтому пришлось выдумывать хитрую, но 100% рабочую схему в Oracle.

Начальная ситуация: статистика, есть таблица с периодами (periods) и таблица со статистическими данными, которые расположены по датам (несколько записей за день), но не всегда за все даты есть данные или требуется отобразить период, который еще не закончился, но показать нужно от начала до конца с нулями за даты, которые еще не прошли.

 select d.dt, sum(<здесь все что нужно выбрать из таблицы статистики>)
 from
 ( 
   SELECT (TRUNC(( select databegin from periods where period_id= '<идентификатор периода>' ), 'DD') + ROWNUM -1) as dt  
   FROM all_objects WHERE ROWNUM <= ( select trunc(dataend) - trunc(databegin) from periods where period_id= '<идентификатор периода>' ) + 1
) d
left join 
( <таблица или несколько статистики> ) e
on d.dt=trunc(e.date)
group by d.dt

Читать дальше...