cx_oracle возвращает входные параметры с помощью keywordParameters

#python #python-3.x #oracle #cx-oracle

#python #python-3.x #Oracle #cx-oracle

Вопрос:

Я использую cx_oracle для выполнения вызовов db proc для нашей базы данных. Мы должны строго избегать позиционных параметров и использовать именованные параметры только в наших вызовах БД. Проблема в том, что в документе упоминается —

Параметры ключевых слов будут включены после позиционных параметров и не будут возвращены как часть выходной последовательности.

и так ясно, что я не возвращаю входные параметры БД своим вызовом. Предполагается, что эти входные параметры должны быть обновлены, и мне нужны обновленные значения при дальнейших вызовах других процессов БД. cx-документ Oracle

Вызовите 1 с позиционными параметрами —

 output = connection.cursor() 
result = cursor.callproc("get_some_data", ["name", cx_Oracle.Binary(), output ])
 

возвращает список с обновленными значениями параметров ввода / вывода.

Вызов 2

 output = connection.cursor() 
result = cursor.callproc("get_some_data", keywordParameters = {"input_1":"name", "input_2": cx_Oracle.Binary(), "output":output })
 

возвращает пустой список, вывод курсора доступен через output переменную.

Есть ли обходной путь?

Комментарии:

1. @ChristopherJones, я буду, но это процесс, требующий времени. Было интересно, есть ли у кого-нибудь быстрое решение, которого мне не хватает. cx_Oracle для keywordParameters недостаточно хорошо документирован.

Ответ №1:

Вы можете получить доступ к переменным IN OUT и OUT, и вы знаете, что передается в параметрах. Таким образом, вы можете делать все, что захотите.

 """
create or replace procedure get_some_data(input_1 in varchar2, input_2 in out varchar2, output out sys_refcursor) as
begin
input_2 := input_1 || ' ' || input_2;
open output for select * from dual;
end;
/
show errors
"""

import cx_Oracle
import os

import sys
if sys.platform.startswith("darwin"):
    cx_Oracle.init_oracle_client(lib_dir=os.environ.get("HOME") "/Downloads/instantclient_19_8")

username = os.environ.get("PYTHON_USERNAME", "cj")
password = os.environ.get("PYTHON_PASSWORD", "cj")
connect_string = os.environ.get("PYTHON_CONNECTSTRING", "localhost/orclpdb1")

connection = cx_Oracle.connect(username, password, connect_string)

with connection.cursor() as cursor:
    output = connection.cursor()
    v = cursor.var(str)
    v.setvalue(0,'Smith')
    result = cursor.callproc("get_some_data", keywordParameters = {"input_1":"Fred", "input_2": v, "output":output })
    print(v.getvalue())
    for row in output:
        print(row)
 

дает:

 Fred Smith
('X',)
 

Комментарии:

1. Ах, я смотрел в совершенно другом направлении и проигнорировал этот простой вариант. Большое спасибо.