今天在oracle 9i 的sqlplusworksheet中發現一個特別怪奇的問題,看如下語句,是先清除sys_object表,然后在該表中insert3條數據,在golden32的5.7版本中執行完全正常:
/*====================*/
/*object data */
/*====================*/
delete from sys_object;
/*merchant*/
--merchant group
insert into sys_object("object_id","object_name","menu_id","object_type","object_user","process","create_user","create_ts","item_seq","object_seq")values('m_mercgr','merchant group','m_merc','w','a','merchant/mercgr_browse.asp','system',sysdate,3,4);
/*mps operation*/
insert into sys_object("object_id","object_name","menu_id","object_type","object_user","process","create_user","create_ts","item_seq","object_seq")values('m_oper','mps operation',null,'m','a','','system',sysdate,2,5);
--payment adjustment
insert into sys_object("object_id","object_name","menu_id","object_type","object_user","process","create_user","create_ts","item_seq","object_seq")values('m_payadj','payment adjustment','m_oper','w','a','operation/payadj_browse.asp','system',sysdate,1,6);
commit;
但在oracle 9i 的sqlplusworksheet中執行時,出現的提示卻是這樣的:
已刪除3行。
已刪除0行。
已創建 1 行。
insert into sys_object("object_id","object_name","menu_id","object_type","object_user","process","create_user","create_ts","item_seq","object_seq")values('m_mercgr','merchant group','m_merc','w','a','merchant/mercgr_browse.asp','system',sysdate,3,4)
*
error 位于第 1 行:
ora-00001: 違反唯一約束條件 (hyh.pk_sys_object)
已創建 1 行。
已創建 1 行。
提交完成。
我郁悶,語句好好的為什么會出錯,看出錯信息是表示在pk字段insert了重復的值,想了半天,頓悟!worksheet分明是在蒙我,數據我都delete了,而且俺的pk字段是object_id字段,不可能有重復的,再仔細看一下返回信息,發現問題了,我明明只寫了一條delete語句,卻返回的兩條delete信息,難道是delete執行了兩次?假如是執行了兩次,那么第二次執行的時候已經沒數據了,所以delete了0,為什么執行了兩次呢?
再看代碼發現一個問題:
delete之后是注釋塊:/*merchant*/
再看報pk錯誤的那一行:
之后也是注釋塊:/*mps operation*/
難道是/**/搞的鬼?
好,試一下,把兩個注釋塊都改為--開頭,再run……
,正常了……,真是氣死我了,果真是/**/的問題,那為什么為這個注釋塊沒問題:
/*====================*/
/*object data */
/*====================*/
注:該塊之前還是有其它語句的。
多次測試發現,/*后面直接跟26個英文字母的注釋塊會導致worksheet把該注釋塊前的語句重新執行一次!
/*大小寫字母*/
其實好像是:這樣的注釋/*大小寫字母*/使sqlplus worksheet重新執行了緩沖區中的命令行!
不知我寫的或我理解的對不對,反正我的問題解決了,有疑問的話就自己試試吧