我已经搜索并尝试了一切可能的方式(我相信)能够将参数传递给我的Pyhton代码中的SQL字符串。我也得到错误: 1. cx_Oracle.DatabaseError:ORA-01036:非法变量名称/号码;要么, 2. typeerror:'str'对象不可调用
以下是我想要做的简单版本。最后,我有一个列表中的字符串名称列表,我希望使用'for'循环,但我想,让我们先使用这个简单的版本。
我已经能够在没有参数替换的情况下使用它。
有什么想法吗?
X = 'XX_Delete'
connection = cx_Oracle.connect('p123/p132.xyz@oratfc01')
cursor = connection.cursor()
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', X)
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', (X))
#cursor.execute('Create TABLE %s as select * from tsapw_period where diskey = 200', str(X))
#cursor.execute('Create TABLE :s as select * from tsapw_period where diskey = 200', (X))
#cursor.execute('Create TABLE :s as select * from tsapw_period where diskey = 200' %(X))
sql = "Create TABLE :s as select * from tsapw_period where diskey = 200"
param = (X)
cursor.execute(sql, param)
答案 0 :(得分:0)
尝试(X,),即在X和右括号之间使用逗号,这基本上确保您传入一个元素作为第二个参数。对于元组中的两个或更多元素,您不需要尾随逗号。希望这可以帮助。
答案 1 :(得分:0)
将变量添加到SQL语句中的最佳方法是使用像您尝试的那样准备好的语句。有了这些陈述,用户很难注入错误的代码。
bind Variable Patterns有不同的方法。
对于您的示例,应该是:
cursor.execute('Create TABLE :tab as (select * from tsapw_period where diskey = 200)', tab='foo')
或
cursor.execute('Create TABLE :0 as (select * from tsapw_period where diskey = 200)', ('foo',))
答案 2 :(得分:0)
显然,我不喜欢以这种方式传递参数。这很有效:
cursor.execute('Create TABLE {} as select * from tsapw_period where diskey = 200'.format(X))