5つの引数があるようですsp_newPerson()
(すべてを正しくカウントし?
た場合)が、4つのパラメーターのみで実行しようとしたか、4つのパラメーターがありますが、さらに1つ追加しました?
。
cur.execute("{CALL sp_newPerson(?,?,?,?,?)}", (self.id, self.fname, self.lname, self.address, self.something))
また:
cur.execute("{CALL sp_newPerson(?,?,?,?)}", (self.id, self.fname, self.lname, self.address))
編集:
OUTパラメータで関数またはプロシージャを使用しようとしているようです。
PythonODBCで準備された呼び出しで機能するかどうかを確認するMSSQLがありません。他のデータベースには問題があります。戻り値またはOUTパラメータを取得するPythonODBCコードを作成するのはおそらく難しいでしょう。CまたはDelphiから、ODBCドライバーは、そのような関数/手順を実行する前にバッファーが割り当てられるため、埋めることができます。Pythonでは、それが可能かどうかはわかりません。PreparedStatementsはJDBC-ODBCブリッジでも、JDBC(Jythonから使用)で機能することがわかりましたが、JDBCは特殊なAPIを使用して入力パラメーターと出力パラメーターを指定します。Oracle DBからの関数の呼び出しに関する私の質問も参照してください:ODBCを介してOracleデータベース関数の結果を取得するにはどうすればよいですか?
最善の方法は、回避策を使用することだと思います。sp_newPerson()
関数の場合:
に変換しSELECT
ます。一部のデータベース、特にOracleでは、関数がデータベースを変更する場合(INSERT、UPDATE、またはDELETEを使用)、機能しません。
cur.execute("SELECT sp_newPerson(?,?,?,?)", (self.id, self.fname, self.lname, self.address))
for row in cur.fetchall():
r = row[0]
に変換しINSERT
ます。もちろん、tmp
テーブルを作成したり、クリアしたりする必要があります。
r = cur.execute("INSERT INTO tmp (new_person_id) VALUES (sp_newPerson(?,?,?,?))", (self.id, self.fname, self.lname, self.address))
if r == 1:
cur.execute("SELECT new_person_id FROM tmp")
for row in cur.fetchall():
r = row[0]