Return variable from cx_Oracle PL/SQL call in Python

后端 未结 3 742
孤独总比滥情好
孤独总比滥情好 2020-12-19 06:29

I want to execute an Oracle PL/SQL statement via cx_oracle in Python. Code looks like this:

db = cx_Oracle.connect(user, pass, dsn_tns)
cursor = db.cursor()
         


        
3条回答
  •  南方客
    南方客 (楼主)
    2020-12-19 07:13

    Agree with M. Wymann, and i had need of returning a string by passing number of elements in list. here is my code.

    cursor = con.cursor()    
        for a,b,c in data:
        statement='''DECLARE
         t_name     VARCHAR2 (50);
         owner      VARCHAR2 (50);
         c_name     VARCHAR2 (50);
         O_type     VARCHAR2 (50);
         nullable   VARCHAR2 (20);
    BEGIN
       SELECT t1.table_name,
              t1.owner,
              t1.column_name,
              CASE
                 WHEN t1.data_type = 'NUMBER' AND t1.data_precision IS NULL
                 THEN
                    'NUMBER'
                 WHEN t1.data_type = 'DATE'
                 THEN
                    t1.data_type
                 WHEN REGEXP_REPLACE (t1.data_type, '(\d)|VAR', '') = 'CHAR'
                 THEN
                    t1.data_type || '(' || t1.DATA_LENGTH || ')'
                 WHEN     t1.data_type = 'NUMBER'
                      AND t1.data_precision IS NOT NULL
                      AND t1.data_scale = 0
                 THEN
                    'NUMBER(' || t1.data_precision || ')'
                 WHEN     t1.data_type = 'NUMBER'
                      AND t1.data_precision IS NOT NULL
                      AND t1.data_scale <> 0
                 THEN
                    'NUMBER(' || t1.data_precision || ',' || t1.data_scale || ')'
                 ELSE
                    'Not Handled'
              END
                 "Oracle data type",
              t1.nullable
         INTO t_name,
              owner,
              c_name,
              O_type,
              nullable
         FROM all_tab_columns t1
        WHERE     t1.table_name = :tname
              AND t1.owner = :towner
              AND t1.column_name = :tcolname;
    
       :o_result :=
             t_name
          || '|'
          || owner
          || '|'
          || c_name
          || '|'
          || O_type
          || '|'
          || nullable;
    EXCEPTION
       WHEN OTHERS
       THEN
          t_name := :tname;
          c_name := 'NOT FOUND ';
          owner := :towner;
          O_type := 'NOT FOUND ';
          nullable := 'NOT FOUND ';
          :o_result :=
                t_name
             || '|'
             || owner
             || '|'
             || c_name
             || '|'
             || O_type
             || '|'
             || nullable;
    END;'''
        o_result = cursor.var(cx_Oracle.STRING)`enter code here`
        cursor.execute(statement, tname=a, towner=b, tcolname=c, o_result=o_result)
        ObLst = o_result.getvalue().split('|')
    

提交回复
热议问题