0

次のクエリは正常に機能しています (辞書で値を渡します)

cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:markerid,:shapename,:errcode,'0',:sysid,sysdate,'OPEN',:usercomment,:x1,:y1,0,:x2,:y2,0,1,:jobno,:srcacnum,chr(182) || :workarea || chr(182),0,0)""",
            {"markerid" : markerId,
             "shapename" : str(errorMarkerLayer.name()),
             "errcode" : errCode ,
             "sysid" : self.sysid ,
             "usercomment" : str(comments),
             "x1" : startPnt[0],
             "y1" : startPnt[1],
             "x2" : endPnt[0],
             "y2" : endPnt[1],
             "jobno" : self.jobNo,
             "srcacnum" : src_AcNum,
             "workarea" : self.wrkArea
             })

しかし、以下のリストで値を渡すことは機能していません 'Variable_TypeByValue(): 未処理のデータ型タプル

cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:1,:2,:3,'0',:4,sysdate,'OPEN',:5,:6,:7,0,:8,:9,0,1,:10,:11,chr(182) || :12 || chr(182),0,0)""",
            [(1 , markerId),
             (2 , str(errorMarkerLayer.name())),
             (3 , errCode),
             (4 , self.sysid),
             (5 , str(comments)),
             (6 , startPnt[0]),
             (7, startPnt[1]),
             (8 , endPnt[0]),
             (9, endPnt[1]),
             (10 , self.jobNo),
             (11 , src_AcNum),
             (12 , self.wrkArea)
             ]) 
4

2 に答える 2

1

リストを指定すると、キーを検索するのではなく、リスト内の位置に従ってパラメータがクエリに含まれます。したがって、最初の値(1, markedId)は ではなく に置き換えられmarkerIdます。

タプルのリストは簡単に辞書に変換できますが、同じデータ構造ではありません。dict()first を使用してパラメーターを辞書に変換すると機能します。

cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:1,:2,:3,'0',:4,sysdate,'OPEN',:5,:6,:7,0,:8,:9,0,1,:10,:11,chr(182) || :12 || chr(182),0,0)""",
            dict([(1 , markerId),
             (2 , str(errorMarkerLayer.name())),
             (3 , errCode),
             (4 , self.sysid),
             (5 , str(comments)),
             (6 , startPnt[0]),
             (7, startPnt[1]),
             (8 , endPnt[0]),
             (9, endPnt[1]),
             (10 , self.jobNo),
             (11 , src_AcNum),
             (12 , self.wrkArea)
             ])) 

cx_Oracle を使用している場合は、こちらのドキュメントを参照してください。

于 2013-05-03T12:39:13.123 に答える
0

リスト (2 番目のコード例) には、まだ「名前付き」パラメーターがあります。「:markerid」のような素敵な名前の代わりに、「:1」があります。名前付きパラメーターを使用する場合は、辞書を使用する必要があると思います。

数値の名前付きパラメーターを使用する必要がある場合は、数値のキー名で辞書を作成するだけです。

単に位置の置換が必要な場合は、「?」構文はサポートされている可能性がありますが、「?」はお勧めしません。これは保守が難しく、入力で同じ値を複数回指定する必要があるためです。

もう 1 つのオプションは、pythons 文字列フォーマット/置換演算子「%」を使用することです。これは、クエリの実行前にパラメーター置換を処理していることを意味します。

于 2013-06-06T15:50:17.737 に答える