Получить тип в Python с помощью cx_Oracle - PullRequest
0 голосов
/ 11 июня 2019

Я работаю в виде простого сценария для загрузки файла дампа в установку Oracle AWS RDS.

Но у меня есть некоторые проблемы при получении FILE_TYPE с connection.gettype

Вот мой код:

from __future__ import print_function

import cx_Oracle
size_limit=1024
print(cx_Oracle.clientversion())

connection = cx_Oracle.connect("XXX", "XX", "XXXX:XXX/XXX")
cursor = connection.cursor()
try:
    typeObj = connection.gettype("VARCHAR")
    OTYPE = connection.gettype("UTL_FILE.FILE_TYPE")
    NFILE = cursor.callfunc('UTL_FILE.FOPEN',returnType=OTYPE,parameters=['DATA_PUMP_DIR','BIOMGRDB_DEV-test.dmp','wb',size_limit]) 

    f = open("BIOMGRDB_DEV.dmp", "rb")
    try:
        byte = f.read(size_limit)
        while byte != "":
            # Do stuff with byte.
            print("Reading")
            print(byte)
            cursor.callfunc('UTL_FILE.PUT_RAW', parameters=[NFILE,byte])
            byte = f.read(size_limit)
    finally:
        cursor.callfunc('UTL_FILE.FCLOSE', parameters=[NFILE])
        f.close()
finally:
    print("FINALLY")
    cursor.close()
    connection.close()

Ошибка следующая, независимо от того, какой тип я использую:

cx_Oracle.DatabaseError: OCI-22303: type ""."UTL_FILE.FILE_TYPE" not found

Похоже, что он пытается найти тип внутри пакета.

Я запустил следующий код PL / SQL, чтобы убедиться, что у меня есть права на запись файлов:

declare 
  fHandle  UTL_FILE.FILE_TYPE;
begin
  fHandle := UTL_FILE.FOPEN('DATA_PUMP_DIR', 'test_file', 'w');

  UTL_FILE.PUT(fHandle, 'This is the first line');
  UTL_FILE.PUT(fHandle, 'This is the second line');
  UTL_FILE.PUT_LINE(fHandle, 'This is the third line');

  UTL_FILE.FCLOSE(fHandle);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' || SQLERRM);
    RAISE;
end;

И это хорошо работает.

Вот моя конфигурация enviornmet:

Python 2.7.13 Мгновенный клиент (19, 3, 0, 0, 0) cx_Oracle 7.1.3 Oracle 12c

Я надеюсь, что кто-то можетпомогите мне.


Обновление

Я создаю новый тип следующим образом:

CREATE OR REPLACE TYPE TYPE1 AS OBJECT 
( SOMETHING VARCHAR2(100)
)

И если я использую его следующим образом:

OTYPE = connection.gettype("TYPE1")

Это работает, и я получаю следующую ошибку:

NFILE = cursor.callfunc('UTL_FILE.FOPEN',returnType=OTYPE,parameters=['DATA_PUMP_DIR','BIOMGRDB_DEV-test.dmp','wb',size_limit])
cx_Oracle.DatabaseError: ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:

Теперь у меня есть вопрос: как я могу использовать объект FILE_TYPE в cx_Oracle?

Я также пытался создатьсиноним и не работает.Любое предложение?

1 Ответ

0 голосов
/ 12 июня 2019

Это работает точно так, как ожидалось:

import cx_Oracle

conn = cx_Oracle.connect("user/pw@host/service")
fileType = conn.gettype("UTL_FILE.FILE_TYPE")
cursor = conn.cursor()
sizeLimit = 1024
result = cursor.callfunc("UTL_FILE.FOPEN", fileType,
        ["DATA_PUMP_DIR", "test_file", "wb", sizeLimit])
print("Result:", result)

Пожалуйста, попробуйте этот скрипт и сообщите об ошибке и трассировке, которую вы получите.Также, пожалуйста, сообщите точную версию базы данных, которую вы используете.Существуют ограничения для использования типов PL / SQL, таких как записи (именно таков UTL_FILE.FILE_TYPE).

...