Форум сайта python.su
кто работал с cx_Oracle и PLSQL…ибо весь инет облазил..а ответов не нашел..
необходимо выполнять PLSQL запросы..и если анонимные блоки кода выводят какие либо данные то сохранять их..сами запросы уже есть..и менять в них ни единого символа нельзя..
если есть кто работал с таким..памажите…
Офлайн
Используй dbms_output.get_line
Пример http://osdir.com/ml/python.db.cx-oracle/2007-02/msg00015.html
Сам не пробовал. Когда-то была необходимость такое сделать - обошелся без python:
# sqlplus … | some_filters > file
Офлайн
Привет.
Я нашел один пример, не очень “правильный” в плане синтаксиса, но у меня работает:
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'""")
Офлайн
необходимо выполнять запросы типа..:
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;
Отредактировано (Сен. 3, 2009 11:30:41)
Офлайн
goblin_maksну так в примере показано как прочитать вывод DBMS_OUTPUT.put_line через DBMS_OUTPUT.get_line.
необходимо выполнять запросы типа..
Офлайн
Попробовал. работает.
>>> 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]
Офлайн
пасибо…действительно помогло…первый раз невнимательно пробовал..:rolleyes:
Офлайн