pyodb c .ProgrammingError: ('SQL содержит 1 маркеры параметров, но было предоставлено 2 параметра', 'HY000')
Вы получаете эту ошибку, потому что табличный параметр - это список итераций (предпочтительно кортежей) ...
my_tvp = [('Hello!', 1), ('Goodbye!', 2)]
print(f"my_tvp contains {len(my_tvp)} row(s)")
# my_tvp contains 2 row(s)
... и если вы передадите это непосредственно в .execute()
, то каждая строка будет интерпретирована как значение параметра:
sql = "{CALL TestTypeProcedure (?)}"
params = my_tvp
print(f"calling SP with {len(params)} parameter value(s)")
# calling SP with 2 parameter value(s)
crsr.execute(sql, params) # error
Следовательно, вам нужно обернуть ваш тв в кортеж, чтобы сделать его одним параметром
sql = "{CALL TestTypeProcedure (?)}"
params = (my_tvp, ) # tuple containing a single tvp "object"
print(f"calling SP with {len(params)} parameter value(s)")
# calling SP with 1 parameter value(s)
crsr.execute(sql, params) # no error