Посты с тэгом cx_oracle


Работаем с оракловыми курсорами в Python с помощью библиотеки cx_Oracle

Курсорная переменная может возвращаться в качестве результата хранимой процедуры, написанной на PL/SQL. Например, вот такой:


create or replace procedure test_cur(
    a number,
    b number,
    p_ret out sys_refcursor)
is
begin
  open
p_ret for select a + level-1 v from dual
          connect by level <= b;
end;

Для работы с СУБД Oracle из Python есть весьма хорошая библиотека cx_Oracle . С курсорами работа построена там очень просто - они объявляются как обычные типизированные переменные библиотеки, в данном случае с типом курсора. Всё очень просто, смотрим на примере:




# -*- coding: utf-8 -*-


Ubuntu 11.04 и cx_Oracle

Обновил сервер до Ubuntu 11.04 - отвалился cx_Oracle. Фокус с easy_install (pip) не сработал. Пришлось совершить несколько телодвижений:
1. Качаем с sourceforge.net нужную версию rpm для CentOs - для 11.04 это будет python 2.7 oracle 10
2. пакет "Чужой" сконвертит rpm в deb> sudo alien -d cx_Oracle-5.1-10g-py27-1.i386.rpm
3. Ставим - > sudo dpkg -i cx-oracle_5.1-2_i386.deb
4. PROFIT? А вот и нет. Python наш модуль не видит. Посему либо поправьте PYTHONPATH, либо совершите дополнительные телодвижения:
cd /usr/lib/python2.7
sudo mv site-packages/cx_Oracle* dist-packages/
sudo rmdir site-packages/
sudo ln -s dist-packages site-packages
Вот теперь всё работает. Enjoy!



Простая установка cx_Oracle на Ubuntu 9.04 в связке с Oracle XE

Теперь ставить cx_Oracle на Ubuntu совсем просто.
1. Поставьте Oracle XE из deb-репозитария Oracle
2. export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
3. sudo apt-get install python-dev python-setuptools
sudo -E easy_install cx_Oracle

4. Test:
$ python
>>> import cx_Oracle
>>> cnxn = cx_Oracle.connect('system/mysystempassword@xe')
>>> crsr = cnxn.cursor()
>>> crsr.execute('SELECT * FROM dual')

Вот и всё.



cx_Oracle. Работа с полями типа LOB (large object).

Прямая вставка.
При прямой вставке достаточно определить тип переменной:

Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning option
JServer Release 9.2.0.8.0 - Production

SQL> create table test( id number, msgtxt clob);

Таблица создана.

test_clob.py:

import cx_Oracle,sys

tns = 'test/test1@test_bd'
conn=cx_Oracle.connect(tns)
curs = conn.cursor();
curs.setinputsizes(p_msg=cx_Oracle.CLOB)

msgtxt= '*' * 10000

try:
curs.execute('''insert into test values (:p_id,:p_msg)''',p_id=1,p_msg=msgtxt)
conn.commit()
except cx_Oracle.DatabaseError,info:
print "SQL Error:", info
sys.exit(1)