oracle存儲過程rollback
❶ oracle的存儲過程不能使用drop語句嗎
存儲過程裡面, 一般只寫 DML 的語句。
也就是基本的 SELECT . INSERT, DELETE , UPDATE 這一類的語句。
如果你要在存儲過程裡面, 執行 DDL 語句。
也就是 CREATE, ALTER, DROP 這一類的語句。
那麼需要使用動態 sql 來處理。
也就是
EXECUTE IMMEDIATE ( 'CREATE TABLE test( id int ) ' );
EXECUTE IMMEDIATE ( 'DROP TABLE test ' );
這樣的方式來處理。
對於 DDL 語句, 這類語句, 如果成功了, 就生效了, 不能回滾的。
也就是
當你 Drop Table 某個表的時候, 執行成功了, 表就被刪除了。
不需要你 Commit 的。
你也無法Rollback , 然這個表不刪除了。
❷ oracle 如何終止存儲過程的運行!
select * from v$access a where object like '存儲過程名%' --存儲過程名為大寫字母
select * from v$session where sid=74 --74為上一個查詢得到的SID值,可能是多個,這里找到他們對應的serial#值
alter system kill session '74,118' --參數為'sid,serial#',用於停止這個回話,同時也終止了存儲過程
❸ oracle存儲過程中如何對一個變數累加賦值 最好有個例子
1、首先打開oracle資料庫,如下圖所示。
❹ Oracle中怎樣用存儲過程將一段字元串以逗號為界截取,並將得到的子串存到另一張表中
❺ 怎麼在存儲過程用事務避免並發
用事務操作語句,如 SAVE POINT; COMMIT; ROLLBACK;
oracle在執行第一個DML語句啟動一個事務,不需要,自己begin transaction。
實際上通常不建議存儲過程中直接控制事務
❻ oracle procere存儲過程
OR REPLACE PROCEDURE 存儲過程名字( 參數1 IN NUMBER, 參數2 IN NUMBER ) IS/AS變數1 INTEGER :=0;變數2 DATE;BEGIN.END 存儲過程名字2、SELECT INTO STATEMENT
將select查詢的結果存入到變數中,可以同時將多個列(欄位)存儲到多個變數中,必須有一條記錄,否則拋出異常(如果沒有記錄,拋出NO_DATA_FOUND)
例子:
BEGIN SELECT col1,col2 into 變數1,變數2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; RAISE; END;3、IF判斷
IF 條件1 THEN Do Someting ELSIF 條件2 THEN Do Someting ELSIF 條件3 THEN Do Someting ELSE Do SometingEND IF;4、while循環
WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP; 5、變數賦值
V_TEST := 123; 6、用for in使用cursor(游標)
. IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END; 7、用pl/sql developer debug
連接資料庫後建立一個Test Window
在窗口輸入調用SP的代碼,F9開始Debug,CTRL+N單步調試
注意事項:
1)存儲過程參數不帶取值范圍,in表示傳入,out表示輸出;
2)變數可帶取值范圍,後面接分號;
3)在判斷語句前最好先用count(*)函數判斷是否存在該條操作記錄
4)用select.into.給變數賦值
5)在代碼中拋出異常用RAISE;通常的用法:
EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;/*異常分很多類,如NO_DATA_FOUND。OTHERS處本應該寫異常名稱,如果不想把異常分得那麼細,可以籠統一點用OTHERS來捕獲,即所有異常均用OTHERS來捕獲。WHEN OTHERS THEN 表示是其它異常。RAISE表示拋出異常,讓User可以看到。*/
6)AS/IS的區別
在試圖(VIEW)中只能用AS不能用IS
在游標(CURSOR)中只能用IS不能用AS
7)輸出變數賦值有兩種,一種是直接:=,還有一種就是SELECT INTO
8)顯示調試信息
a.存儲過程中在必要的位置添加
DBMS_OUTPUT.put_line(『HI『);
b.打開DBMS_OUTPUT
show serveroutput;set serveroutput on;
9)刪除PROCEDURE
DROP PROCEDURE procere_name;
oracle procere存儲過程
❼ oracle存儲過程插入一條數據,運行之後,數據不能插入
這種情況屬於插入數據後,沒有提交(commit),導致表被鎖,所以需要進行提交(commit)或者回滾(rollback)操作。
如果當前session已關閉,可通過如下方法殺掉進程。
1、生成Kill Session語句
select'altersystemkillsession'''||SID||','||SERIAL#||''';'from
(
selectdistincta.sid,a.Serial#,status,machine,LOCKWAIT,logon_time
fromv$sessiona,v$locked_objectb
where(a.status='ACTIVE'ora.status='INACTIVE')
anda.sid=b.session_id
andb.ORACLE_USERNAME='XYHISTEST'--加上用戶名是避免把其他系統的會話也關閉,以免傷及無辜
)
2、批量執行第一步生成的語句
altersystemkillsession'sid,serial#';