Cx_Oracle fetch crash - PullRequest
       7

Cx_Oracle fetch crash

0 голосов
/ 01 апреля 2019

Итак, я запросил данные из базы данных oracle с помощью cursor.execute (). Относительно простой запрос выбора. Это работает.

Но когда я пытаюсь извлечь из него данные, происходит сбой Python.

То же самое происходит для fetchall (), fetchmany () и fetchone ().

Когда запрос сначала прервался в fetchmany (), я решил перебрать fetchone (), и он работал для первых двух строк, а затем прервался в третьей.

Полагаю, это потому, что в третьем ряду слишком много данных.

Итак, есть ли способ обойти эту проблему и извлечь данные?

(Пожалуйста, не обращайте внимания на неправильные отступы, которые невозможно скопировать в моем телефоне)

EDIT: Я удалил четыре столбца с типом «ROWID». После этого не было никаких проблем. Я легко смог получить 100 строк за один раз.

Таким образом, чтобы подтвердить свое подозрение, я пошел дальше и создал еще одну копию, содержащую только эти столбцы со строками, и она вылетает, как и ожидалось.

Так есть ли проблемы с типом ROWID?

Тестовый стол для того же.

Вставить в TEST_FOR_CX_ORACLE (Z $ OEX0_LINES, Z $ OEX0_ORDER_INVOICES, Z $ OEX0_ORDERS, Z $ ITEM_ROWID) значения ( 'ABoeqvAEyAAB0HOAAM', 'AAAL0DAEzAAClz7AAN', 'AAAVeuABHAAA4vdAAH', 'ABoeo + AIVAAE6dKAAQ'); Вставьте в TEST_FOR_CX_ORACLE (Z $ OEX0_LINES, Z $ OEX0_ORDER_INVOICES, Z $ OEX0_ORDERS, Z $ ITEM_ROWID) значения ('ABoeqvABQAABKo6AAI', 'AAAL0DAEzAAClz7AAAAAAAAAAAAAAAAAAAAHAAHAAAHAAAAAAAAAA)). Вставьте в TEST_FOR_CX_ORACLE (Z $ OEX0_LINES, Z $ OEX0_ORDER_INVOICES, Z $ OEX0_ORDERS, Z $ ITEM_ROWID) значения ('ABoeqvABQAABKo6AAG', 'AAAL0DAEzAAClz7AAP', 'AAAVAAAAAAAAAAAAAAAAAAAAAA, AAAAAAAAAAA, AAAAAAAAA, AAAAAAAAAA, AAAAAAAAA, AAAAHAAAAA, AAAAAAAA, AAAAAAA, AAAAHAAAAAA, AAAAAAAAA, AAAAAAA, AAAAAAA, AAAAAAAA, AAAAAAAA, AAAAHAAAA, AAAAAAAA, AAAAAAA, AAAAAAA, AAAAAAA, AAAAAAA, AAA) Вставьте в значения TEST_FOR_CX_ORACLE (Z $ OEX0_LINES, Z $ OEX0_ORDER_INVOICES, Z $ OEX0_ORDERS, Z $ ITEM_ROWID) ('ABoeqvAEyAAB0HOAAK', 'AAAL0DAEzAACl0EAAC', 'AAAVeuAHAAAA +AAAHAAAAAAAAAAAAAAAAAA, UAA), UAA, UAA, UAA, UAA, UAA, UAA, UAA, UAA, UAA, UAA, UAA.

Сценарий:

from cx_Oracle import makedsn,connect,Cursor
from pandas import read_sql_table, DataFrame, Series

from time import time

def create_conn( host_link , port , service_name , user_name , password ):
    dsn=makedsn(host_link,port,service_name=service_name)
    return connect(user=user_name, password=password, dsn=dsn)

def initiate_connection(conn):
    try:
        dbconnection = create_conn(*conn)
        print('Connected to '+conn[2]+' !')
    except Exception as e:
        print(e)
        dbconnection = None
    return dbconnection        

def execute_query(query,conn):
    dbconnection=initiate_connection(conn)
    try:
        cursor = dbconnection.cursor()
        print ('Cursor Created!')
        return cursor.execute(query)
    except Exception as e:
        print(e)
        return None

start_time = time()

query='''SELECT * FROM test_for_cx_oracle'''

try:
    cx_read_query = execute_query(query,ecspat_c)
    time_after_execute_query = time()
    print('Query Executed')
    columns = [i[0] for i in cx_read_query.description]
    time_after_getting_columns = time()
except Exception as e:
    print(e)


print(time_after_execute_query-start_time,time_after_getting_columns-time_after_execute_query)

1 Ответ

0 голосов
/ 03 апреля 2019

К сожалению, это ошибка в клиентских библиотеках Oracle. Вы увидите это, если попытаетесь получить одно и то же значение rowid несколько раз в последовательных строках. Если вы избегаете такой ситуации, все хорошо. Вы также можете установить для переменной среды ORA_OCI_NO_OPTIMIZED_FETCH значение 1, прежде чем запускать запрос, чтобы избежать проблемы.

Об этом сообщалось ранее здесь: https://github.com/oracle/python-cx_Oracle/issues/120

...