Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2009 23:58:01

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

кто работал с cx_Oracle и PLSQL…ибо весь инет облазил..а ответов не нашел..
необходимо выполнять PLSQL запросы..и если анонимные блоки кода выводят какие либо данные то сохранять их..сами запросы уже есть..и менять в них ни единого символа нельзя..
если есть кто работал с таким..памажите…



Офлайн

#2 Сен. 3, 2009 09:38:57

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

Используй dbms_output.get_line

Пример http://osdir.com/ml/python.db.cx-oracle/2007-02/msg00015.html

Сам не пробовал. Когда-то была необходимость такое сделать - обошелся без python:

# sqlplus … | some_filters > file



Офлайн

#3 Сен. 3, 2009 10:54:28

Lunatic
От:
Зарегистрирован: 2009-09-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

Привет.

Я нашел один пример, не очень “правильный” в плане синтаксиса, но у меня работает:

import cx_Oracle

user = 'viewer'
password = '****'
db = 'test'

def db_conn(u=user, p=password, d = db):
return u + "/"+ p + "@" + d

def compare_func(func, param, sql2):
sql1 = 'select ' + func + '(' + param + ') from dual'
try:
connection = cx_Oracle.connect(db_conn())
cur1 = connection.cursor()
cur2 = connection.cursor()
cur1.execute(sql1)
cur2.execute(sql2)

print 'cur1' + str(cur1.fetchall())
print 'cur2' + str(cur2.fetchall())

if cur1.fetchone() == cur2.fetchone():
print "Function \n " + func + " is ok"
else:
print sql1
except cx_Oracle.DatabaseError, exc:
error = exc.args
print >> sys.stderr, "Oracle-Error-Code:", error.code
print >> sys.stderr, "Oracle-Error-Message:", error.message
finally:
cur1.close()
cur2.close()
connection.close()

compare_func('user1.sdk_person.get_personIDbyAccount', """'USER', 93028""" , """select person_id from user1.person_account where object_id= 93028 and object_class = 'USER'""")



Офлайн

#4 Сен. 3, 2009 11:18:44

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

необходимо выполнять запросы типа..:

SET SERVEROUTPUT ON
declare
cursor get_contract_id_N is
select dc.contract_id from double_contr dc, double_invoice do where seqno=145
and do.contract_id = dc.contract_id
and do.contract_id in (4751245)
and rownum<2;
-- contracts double_invoice.contract_id%type;
i_com_type double_invoice.com_type%type;
i_auth_type double_invoice.auth_type%type;
i_comamt double_invoice.comamt%type;
begin
FOR v_gt IN get_contract_id_N LOOP
begin
select do.com_type, do.auth_type, do.comamt into i_com_type, i_auth_type, i_comamt from double_invoice do
where do.contract_id = v_gt.contract_id
and rownum=1;
exception when no_data_found then i_comamt := 0;
end;
DBMS_OUTPUT.put_line('contracts id: '||v_gt.contract_id||' comamt: '||i_comamt||' com_type:'||i_com_type||' auth_type: '||i_auth_type);
END LOOP;
end;
черерез callfunc я так понимаю не покатит..и сделать универсальный шаблон тоже не получится..


наверное будет проще работать через sqlplus и subprocess



Отредактировано (Сен. 3, 2009 11:30:41)

Офлайн

#5 Сен. 3, 2009 11:57:44

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

goblin_maks
необходимо выполнять запросы типа..
ну так в примере показано как прочитать вывод DBMS_OUTPUT.put_line через DBMS_OUTPUT.get_line.



Офлайн

#6 Сен. 3, 2009 13:07:02

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

Попробовал. работает.

>>> import cx_Oracle
>>> con = cx_Oracle.connect('test/test@test')
>>> cur = con.cursor()
>>> cur.execute("""
begin
dbms_output.enable();
dbms_output.put_line('Hello Oracle!');
end;
""")
>>> statusVar = cur.var(cx_Oracle.NUMBER)
>>> lineVar = cur.var(cx_Oracle.STRING)
>>> cur.callproc("dbms_output.get_line", (lineVar, statusVar))
['Hello Oracle!', 0.0]



Офлайн

#7 Сен. 3, 2009 14:49:59

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

кто работал с cx_Oracle и PLSQL

пасибо…действительно помогло…первый раз невнимательно пробовал..:rolleyes:



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version