【问题标题】:How to get complex Oracle UserDefinedType as output of stored proc in SQLALCHEMY如何在 SQLALCHEMY 中获取复杂的 Oracle UserDefinedType 作为存储过程的输出
【发布时间】:2018-11-04 00:40:15
【问题描述】:

我在 Oracle 中有 2 个用户定义的数据类型,用于存储过程的输出。如何使用 SQLALCHEMY 调用此过程并打印输出?我尝试创建一个 types.UserDefinedType 子类并与之绑定结果参数,但我不断收到错误消息,提示 cx_oracle 不支持此类型

Create or replace TYPE type1 as Object (
      param1 NUMBER(15,0),
      param2 clob);
/
create or replace TYPE t_type1 as TABLE OF type1;
/
create or replace PROCEDURE "DO_SOMETHING" (
      results OUT t_type1,
      status OUT CHAR,
      status_msg OUT VARCHAR2)

下面是我试图用来调用以上存储过程的代码。如果存储的 proc 是 oracle 中用户定义的数据类型,我如何绑定婴儿车?

connection = engine.connect()
try:
    proc_query = text(
        "begin DO_SOMETHING(:results,:status, :status_msg); end;",
        bindparams=[outparam('results', <WHAT TO PUT HERE>, outparam('status', CHAR),
                    outparam('status_msg', VARCHAR)])
    result = connection.execute(proc_query)
    status_code = result.out_parameters['results'].strip()
    err_nbr = result.out_parameters['status']
    err_msg = result.out_parameters['status_msg'].strip()
except Exception as e:
    logging.exception(e)
    print("Error occured in refresh_view" ,e)
    raise e
finally:
    connection.close()

【问题讨论】:

    标签: sql oracle sqlalchemy


    【解决方案1】:
    I tweaked a little to use VARCHAR2 instead of CLOB to make life easier :)
    But this should help - 
    
    CREATE OR REPLACE TYPE TYPE1 AS OBJECT (
          PARAM1 NUMBER(15,0),
          PARAM2 VARCHAR2(1024));
    /
    
    
    CREATE OR REPLACE TYPE T_TYPE1 AS TABLE OF TYPE1;
    /
    
    
    CREATE OR REPLACE PROCEDURE DO_SOMETHING (
          RESULTS OUT T_TYPE1,
          STATUS OUT CHAR,
          STATUS_MSG OUT VARCHAR2) AS
    BEGIN
        STATUS_MSG :='STATUS_MSG';
        STATUS := '1';
        RESULTS := T_TYPE1(TYPE1(13,'MESSAGE'));
    END;
    /
    

    打电话-

    SET SERVEROUT ON;
    DECLARE
        RESULTS T_TYPE1;
        STATUS CHAR;
        MSG VARCHAR2(1024);
    BEGIN
        DO_SOMETHING(RESULTS, STATUS, MSG);
        DBMS_OUTPUT.PUT_LINE(STATUS||','|| MSG);
        DBMS_OUTPUT.PUT_LINE(RESULTS(1).PARAM1);
        DBMS_OUTPUT.PUT_LINE(RESULTS(1).PARAM2);
    END;
    /
    

    输出 -

    1,STATUS_MSG
    13
    MESSAGE
    

    【讨论】:

    • 嗨史莱克,感谢您的回复,但我正在寻找一种使用 SQLALCHEMY 执行此过程的方法。我能够按照您提到的方式执行 proc,但是通过 SQLALCHEMY,我只能成功执行那些没有用户定义类型用作 IN 或 OUT 参数的 proc。我将编辑我的问题以添加更多信息。
    猜你喜欢
    • 2015-03-06
    • 2012-10-04
    • 2017-02-21
    • 2011-02-25
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多