使用cx_Oracle获取python中的类型

时间:2019-06-11 06:45:32

标签: python cx-oracle

我正在使用一个简单的脚本来将转储文件加载到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对象?

我也尝试创建一个同义词,但是它不起作用。有什么建议吗?

1 个答案:

答案 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是什么)存在局限性。