從過去的幾個小時開始,我一直在敲我的頭,但找不到根本原因。經歷了多篇文章,但沒有運氣。
我正在嘗試合并存盤在熊貓資料框中的值。下面是我將資料框轉換為串列的代碼
merchantinfo_lst = appenddata.values.tolist()
通過下面的代碼,我試圖將資料合并到目標表中。
sql ='merge into bi.merchant_info_test ';
sql =' using dual';
sql =' on ( ATRANS_ID = :2 )';
sql =' when matched then update set MERCHANT_INFO = :15, MESSAGE_PARAM = :16, PUBLISH_DATE = :13' ;
sql =' when not matched then insert( ADDRESS,ATRANS_ID,CITY_NAME,COUNTRY_CODE,LATITUDE,LONGITUDE,MERCHANT_CATEGORY_CODE,MERCHANT_DESCRIPTOR,MERCHANT_ID,';
sql =' MERCHANT_NAME,PHONE_NUMBER,POSTAL_CODE,PUBLISH_DATE,STATE_PROVINCE_CODE,MERCHANT_INFO,MESSAGE_PARAM )';
sql =' values( :1, :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16 )';
for i in range(len(merchantinfo_lst)):
cur.execute(sql,merchantinfo_lst[i])
我收到 cx_Oracle.DatabaseError: ORA-01008: not all variables bound but all the value are present in the list and all the column are present in the target table。無論我嘗試什么,我都無法解決問題。
Python 版本:2.7.5 cx_Oracle 版本:7.3.0 目標資料庫:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0
表結構
Name Null? Type
---------------------- -------- --------------
ATRANS_ID NOT NULL RAW(36 BYTE)
MERCHANT_ID VARCHAR2(20)
MERCHANT_DESCRIPTOR VARCHAR2(100)
MERCHANT_NAME VARCHAR2(100)
ADDRESS VARCHAR2(250)
CITY_NAME VARCHAR2(100)
STATE_PROVINCE_CODE VARCHAR2(4)
POSTAL_CODE VARCHAR2(10)
COUNTRY_CODE VARCHAR2(10)
LATITUDE VARCHAR2(20)
LONGITUDE VARCHAR2(20)
PHONE_NUMBER VARCHAR2(15)
MERCHANT_CATEGORY_CODE VARCHAR2(6)
MERCHANT_INFO VARCHAR2(250)
MESSAGE_PARAM VARCHAR2(2000)
PUBLISH_DATE DATE
Python代碼
def table_merge(data_frame,uname,passwd,oracle_dsn):
merchantinfo = pd.DataFrame()
transidinfo = pd.DataFrame()
ora_con = oracle_conn(uname,passwd,oracle_dsn)
cur = ora_con.cursor()
now = datetime.now()
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
appenddata['MERCHANT_INFO'] = appenddata['MERCHANT_NAME'] ' ' appenddata['CITY_NAME'] ' ' appenddata['STATE_PROVINCE_CODE'] ' ' appenddata['COUNTRY_CODE'] ' ' appenddata['POSTAL_CODE']
appenddata['MESSAGE_PARAM'] = appenddata['MERCHANT_ID'] '|' appenddata['MERCHANT_INFO']
appenddata['PUBLISH_DATE'] = dt_string
merchantinfo_lst = appenddata.values.tolist()
print('printing list')
print(merchantinfo_lst)
sql ='merge into bi.merchant_info_test ';
sql =' using dual';
sql =' on ( ATRANS_ID = :2 )';
sql =' when matched then update set MERCHANT_INFO = :15, MESSAGE_PARAM = :16, PUBLISH_DATE = :13' ;
sql =' when not matched then insert( ADDRESS,ATRANS_ID,CITY_NAME,COUNTRY_CODE,LATITUDE,LONGITUDE,MERCHANT_CATEGORY_CODE,MERCHANT_DESCRIPTOR,MERCHANT_ID,';
sql =' MERCHANT_NAME,PHONE_NUMBER,POSTAL_CODE,PUBLISH_DATE,STATE_PROVINCE_CODE,MERCHANT_INFO,MESSAGE_PARAM )';
sql =' values( :1, :2, :3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16 )';
for i in range(len(merchantinfo_lst)):
cur.execute(sql,merchantinfo_lst[i])
cur.close()
ora_con.commit()
ora_con.close()
輸出
/home/kkant/microservice-poc % python consumer.py
printing list
[[u'dummy_address', u'123456789', u'dummy_city', u'91', u'', u'', u'2345', u'dummy', u'123', u'dummy_merchant', u'1234567890', u'123456', '27/05/2022 11:32:22', u'', u'dummy_merchant dummy_city 91 123456', u'123|dummy_merchant dummy_city 91 123456'], [u'dummy_address', u'1234567455', u'dummy_city', u'91', u'', u'', u'2345', u'dummy', u'456', u'dummy_merchant', u'1234567890', u'123456', '27/05/2022 11:32:22', u'', u'dummy_merchant dummy_city 91 123456', u'456|dummy_merchant dummy_city 91 123456']]
Traceback (most recent call last):
File "consumer.py", line 102, in <module>
table_merge(appenddata)
File "consumer.py", line 71, in table_merge
cur.execute(sql,merchantinfo_lst[i])
cx_Oracle.DatabaseError: ORA-01008: not all variables bound
[enter image description here][1]
uj5u.com熱心網友回復:
問題是您是按位置系結的,而不是按名稱系結的。因此,每個系結變數位置都需要一個條目。SQL 陳述句第一部分中的 value :2 需要一個值,SQL 陳述句最后一部分中的 value :2 也需要一個值!(對于您的 SQL 陳述句中提到的每個系結變數,依此類推——其中 20 個)。如果您不想這樣做,則可以改為按名稱系結(并提供引數字典)。
另一種可能可行的方法是對所有引數執行“查詢”,如下所示:
merge into bi.merchant_info_test target
using select :1 as x, :2, as y, :3 as z, ... from dual source
on target.atrans_id = source.atrans_id
when matched then update set merchant_info = source.merchant_info ...
when not matched then insert (ADDRESS, ...) values (source.address, ...)
這樣,您只有一個地方需要系結變數,而不是兩個(對于其中一些)。
幾天前發布的新 Python 驅動程式 (python-oracledb) 在使用瘦模式時對此類事情有更好的錯誤訊息(有關詳細資訊,請參閱檔案)。使用該驅動程式嘗試您的示例以找出問題的根源可能是值得的。
附帶說明一下,最好在插入多行時使用 executemany(),而不是遍歷串列并重復呼叫 execute()。性能差異可能是驚人的,尤其是對于大量行!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/483091.html
上一篇:Oracle11g-插入選擇/插入和更新(里面的dbfiddle示例)
下一篇:年月日總和-OracleSQL
