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