我正在使用一个简单的脚本来将转储文件加载到AWS RDS Oracle安装中。
但是在通过connection.gettype获取FILE_TYPE时遇到一些问题
这是我的代码:
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 甲骨文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:
现在,我有一个问题:如何在cx_Oracle中使用FILE_TYPE对象?
我也尝试创建一个同义词,但是它不起作用。有什么建议吗?
答案 0 :(得分:0)
这完全符合预期:
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是什么)存在局限性。