python 使用占位符插入选择PYODBC

ig9co6j1  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(216)

我尝试使用select语句用pyodbc向DB2db插入一行。
下面是一段代码:

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)')

我试着在没有占位符(硬编码的信息)的情况下执行语句,它工作得很好。
编辑(DB表):

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))""")
m1m5dgzv

m1m5dgzv1#

它在没有占位符的情况下工作,因为在这种情况下,SQL语句是有效的。
但是你把占位符放在无效的地方,你不能在SELECT列表中取消它们的类型。对于i系列,参数标记可以出现在主机变量可能出现的任何位置。
i-series返回代码“-418”,您可以在这里查找(SQL 0418 N),这意味着:* “SQL 0418 N未处理该语句,因为该语句包含对以下内容之一的无效使用:非类型化参数标记、DEFAULT关键字或空值。“*
参数标记(占位符)主要出现在WHERE子句中。请参阅此页(适用于Db2-LUW)pagethis页的“适用于i系列的Db2”中记录的限制。
当您希望在结果集中有不同的列时,您需要准备/执行不同的SQL语句(每个语句在SQL的有效位置可以有不同的参数标记)。
当您需要不同的常量值时(即不是列名),在结果集中,参数标记需要用适当的类型转换来键入。

相关问题