PYODBC 插入选择与占位符

问题描述 投票:0回答:2

我正在尝试使用 select 语句将带有 pyodbc 的行插入到 DB2 数据库中。

这是一段代码:

cursor.execute("""INSERT INTO BIUMO220.delivery_notes(id, date, provider_id)
            SELECT ?, ?, P.id
            FROM BIUMO220.providers P
            WHERE P.name = ?,
            DELIVERY_ID.get().upper(), DELIVERY_DATE.get().upper(), PROVIDER.get().upper()""")

所有这些变量都来自 Tkinter 表单。

但是当我执行代码时出现这个错误:

pyodbc.ProgrammingError: ('42000', '[42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0418 - The use of parameter marker or NULL is invalid. (-418) (SQLPrepare)')

我尝试在没有占位符(信息硬编码)的情况下执行语句并且它工作正常。

编辑(数据库表):

cursor.execute("""CREATE TABLE BIUMO220.delivery_notes(
                id VARCHAR(50) NOT NULL,
                date DATE NOT NULL,
                provider_id INT NOT NULL,
                FOREIGN KEY (provider_id) REFERENCES BIUMO220.providers(id),
                PRIMARY KEY (id))""")

cursor.execute("""CREATE TABLE BIUMO220.providers(
                id INT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 1),
                name VARCHAR(255) NOT NULL,
                PRIMARY KEY (id))""")
python python-3.x tkinter db2 pyodbc
2个回答
0
投票

不确定这是否是问题所在,但您可以尝试将参数标记转换为适当的类型。例子:

cursor.execute("""
    INSERT INTO BIUMO220.delivery_notes(id, date, provider_id)
    SELECT CAST(? AS INT), ...
    

或者如果您有一个不错的新 db2 for LUW 版本:

cursor.execute("""
    INSERT INTO BIUMO220.delivery_notes(id, date, provider_id)
    SELECT ?::INT, ...

0
投票

它在没有占位符的情况下工作,因为在那种情况下你的 SQL 语句是有效的。

但是你把占位符放在它们无效的地方,你不能在 SELECT 列表中取消输入它们。对于 i 系列,参数标记可以出现在主机变量可能出现的任何地方。

i 系列返回代码“-418”,您可以在here(SQL0418N)中查找,这意味着:“SQL0418N 语句未处理,因为该语句包含以下其中一项的无效使用:未类型化的参数标记、DEFAULT 关键字或空值。 “

参数标记(占位符)主要出现在WHERE子句中。请参阅此(对于 Db2-LUW)page 和“Db2 for i series”在this page 上记录的限制。

当您想要结果集中的不同列时,您需要准备/执行不同的 SQL 语句(每个语句在 SQL 的有效位置可以有不同的参数标记)。

当你想要不同的常量值(即不是列名)时,在结果集中,参数标记需要使用适当的类型转换。

© www.soinside.com 2019 - 2024. All rights reserved.