Я работаю в виде простого сценария для загрузки файла дампа в установку 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?
Я также пытался создатьсиноним и не работает.Любое предложение?