2

我需要在 python 中调用存储过程。包装函数接受 n 个参数。根据参数列表,我需要引用或取消引用参数。我还需要发送一个空参数。

如何遍历函数参数并构建 SQL 字符串?

例如。存储的过程调用看起来像这样 - SP_TEST('chrA',intB,chrC)

def execSp(a,b,c,d):
    <iterate through params and build param list>
    #If the parameter c is null the SQL should be built as below
    SQL="exec SP_TEST('a',b,Null)";

我尝试使用 locals() 但是它返回一个无序列表

我是 python 新手,所以任何线索都会有很大帮助。

4

5 回答 5

0

您可以使用以下*args构造:

In [1]: def execSp(*args): print args

In [2]: execSp('abc', 1, 'xyz')
('abc', 1, 'xyz')
于 2013-02-03T18:29:35.823 回答
0

你可以这样做:

def execSp(*args):
    if len(args) != 4:
        raise SomeException()
    a,b,c,d = args
    <you can now iterate over args and use a,b,c,d as required>
于 2013-02-03T18:29:43.530 回答
0
>>> def f(*args):
...   for a in args:
...     print a
... 
>>> f(1, 2, 3, 4)
1
2
3
4
于 2013-02-03T18:30:07.567 回答
0

您需要构建自己的查询吗?通常,您将依靠 DB api 为您引用您的论点。这将避免您遭受 SQL 注入的困扰。

cursor.execute('exec SP_TEST(?, ?, ?)', a, b, c)
于 2013-02-03T18:34:09.837 回答
0

以下正是您想要的。它首先将列表 AV 初始化为所有 NULL,然后迭代提供的参数数量,并适当地替换它们以形成您想要的查询字符串。该SQL =字符串仅将引号添加到第一个参数。我是否正确理解您要做什么?

def execSp(*args):
  AV = []
  SQL = "exec SP_TEST(";
  for ii in range(0,4) :
    AV.append("NULL");
  ii = 0;

  for a in args:
    AV[ii] = str(a);
    ii+=1;

  SQL = SQL + "\'" + AV[0] + "\'," + AV[1] + "," + AV[2] + "," + AV[3] + ")";
  print SQL

execSp("hello", 1, 2, 3);
execSp("hi", 2, 3);

当我运行这个时,我得到

exec SP_TEST('hello',1,2,3)
exec SP_TEST('hi',2,3,NULL)
于 2013-02-03T19:07:54.290 回答