sybase事務中呼叫含有臨時表的儲存過程的問題

2021-08-29 19:44:34 字數 1295 閱讀 4301

原來呼叫儲存過程的地方都沒有使用

事務,當然裡面包括多個表的更新操作,使用都很正常。後來我給加上了

jdbc事務,

**如下:

引用:

transactionstatus status = super.begintransaction();

try catch (exception e)

加上事務之後就發現儲存過程沒有完全執行,裡面的update語句都沒有執行,但是最後的select還能返回結果集,呼叫後台也不

報錯……百思不得其解。後來湊巧把儲存過程中建立臨時表的如下

語句:

引用:

-- 建立臨時表

create table #tmpbagl (

bh int,                    -- 編號

rwxh smallint              -- 任務序號

)

移到了使用這個臨時表的if else裡面,因為只有在一定的條件下才需要建立臨時表。再試了一下呼叫儲存過程,發現一切正常了!這一次儲存過程沒有執行建立臨時表,就正常了……遂上網搜到乙個如下的描述:

引用:

select into可以在事務中使用,但是前提條件是這個事務只有select into一條語句。

select into command not allowed within multi-statement transaction.  

注意是multi-statement transaction

大家都知道,select into #tabel的最大優勢是速度快,但這個速度快是用不記錄

日誌來實現的。

而使用事務的目的就是要麼事務中的所有操作全部執行,要麼所有操作全部回滾。

這是靠日誌中記錄的操作來保證的。

如果select into可以在多語句的事務中使用,但是它本身又是不計日誌的,也就是不能回滾的。

這就和事務的定義矛盾了。

因此,select into不能在多語句的事務中使用。

但也不是說我們不能使用select into這個好東東,set chained off,使用非鏈式事務或者把select into

放在單獨乙個事務中執行就可以了。

還有乙個在多語句事務中被禁止的,而在

應用中會常需要的命令是truncate table。

原因和解決方法也如上所說。

把儲存過程還原成最開始那樣,在建立臨時表之前加上set chained off,再次執行

問題解決。

ODBC呼叫sybase的儲存過程

create procedure test icount integer,dtmodifytime datetime,dcquantity decimal 20,2 output as 在程式中呼叫這個儲存過程,如下 trycatch odbcexception oe 程式執行到cmd.execut...

資料庫 儲存過程互相呼叫時 臨時表的命名注意點

最近寫了兩個儲存過程,它們相互之間會互相呼叫。在資料庫中直接測試執行時都沒有問題,在 中傳入引數呼叫後發現會有報錯。折騰了乙個下午之後,還是組長找出故障原因出來。原來互相呼叫的兩個儲存過程中,臨時表或變數的命名最好得有所區別,否則會呼叫錯誤,導致執行出錯。我簡短地寫兩個儲存過程來示範一下,不一定能執...

建立臨時表的儲存過程(帶返回的游標)

create or replace package welldailycross is type ref cursor is ref cursor 建立帶返回的游標 procedure prowelldailycross starttime in varchar2,endtime in varcha...