mysql 事务块 sql_Oracle_PL/SQL的基本写法_BEGIN_END块结构及简单的事务实现
雖然之前寫了不少Oracle上的SQL語句,但是沒有抽出時間對Oracle進(jìn)行一個系統(tǒng)的學(xué)習(xí),實(shí)踐固然重要,但沒有一個理論上的規(guī)范學(xué)習(xí)與理解,在實(shí)踐中就不能舉一反三,就不能寫出高規(guī)范高質(zhì)量的SQL語句。
-- PL/SQL 基本寫法
-- 說明:聲明、異常處理部分為可選,視具體程序而定
-- 博客記錄點(diǎn)滴 http://www.linuxidc.com?轉(zhuǎn)載注明出處
DECLARE -- 聲明變量
A INTEGER;-- 只聲明
B FLOAT := 0;-- 帶賦值的聲明
C FLOAT;
BEGIN -- 可執(zhí)行語句開始
DBMS_OUTPUT.put_line('開始執(zhí)行可執(zhí)行語句塊![http://www.linuxidc.com轉(zhuǎn)載注明出處]');
A := 1.5;
DBMS_OUTPUT.put_line('A=' || A);
DBMS_OUTPUT.put_line('B=' || B);
C := A / B; -- 會引發(fā)分母為0的異常,下面的兩條輸出語句將無法執(zhí)行
DBMS_OUTPUT.put_line('C=' || C);
DBMS_OUTPUT.put_line('可執(zhí)行語句塊執(zhí)行完畢![http://www.linuxidc.com轉(zhuǎn)載注明出處]');
EXCEPTION -- 異常處理
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('[PL/SQL 基本寫法]中出現(xiàn)異常,錯誤代碼:ORA'||sqlcode);
END; -- 可執(zhí)行語句結(jié)束
/ -- 該符號表示執(zhí)行這段PL/SQL代碼
執(zhí)行后的輸出:
開始執(zhí)行可執(zhí)行語句塊![http://blog.csdn.net/ls_man轉(zhuǎn)載注明出處]
A=2
B=0
[PL/SQL 基本寫法]中出現(xiàn)異常,錯誤代碼:ORA-1476
我們再看一下如何通過異常處理實(shí)現(xiàn)數(shù)據(jù)庫事務(wù):
-- PL/SQL 事務(wù)
-- 說明:有多條修改數(shù)據(jù)的語句執(zhí)行,如果其中某條出錯,之前的更改也不會記入數(shù)據(jù)庫
-- 博客記錄點(diǎn)滴 http://www.linuxidc.com 轉(zhuǎn)載注明出處
-- 1.先創(chuàng)建一個測試表
DECLARE
V_SQL_DROP_TABLE? VARCHAR2(50) := 'DROP TABLE MY_TEST';
V_SQL_CREATE_TABLE VARCHAR2(100) := 'CREATE TABLE MY_TEST(NOT_NULL VARCHAR2(20) NOT NULL, ONLY_INT INTEGER)';
BEGIN
EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 創(chuàng)建測試表
EXCEPTION
-- 如果表已存在,則會引發(fā)異常
WHEN OTHERS THEN
EXECUTE IMMEDIATE V_SQL_DROP_TABLE; -- 先刪除
EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 再創(chuàng)建
END;
/
--2.用我們剛創(chuàng)建的測試表進(jìn)行測試
DECLARE
V_COUNT INTEGER; -- 表中記錄的行數(shù)
V_INT_VAL MY_TEST.ONLY_INT%TYPE; -- 使用%TYPE關(guān)鍵字參照某表某字段類型聲明變量
BEGIN
V_INT_VAL := 123456;
-- 插入一條正確的數(shù)據(jù)
INSERT INTO MY_TEST VALUES ('TEST_SUCCESS', V_INT_VAL);
-- 查詢條數(shù)為1條,我們發(fā)現(xiàn)插入成功了
SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;
DBMS_OUTPUT.put_line('MY_TEST表中有' || V_COUNT || '條記錄');
-- 插入一條錯誤的數(shù)據(jù),因?yàn)榈诙€字段為int型,插入字符數(shù)據(jù)肯定會出錯
INSERT INTO MY_TEST VALUES ('TEST_FAIL', 'ABC');
-- 最后提交更改
COMMIT;
EXCEPTION
-- 異常處理
WHEN OTHERS THEN
ROLLBACK; -- 異常時回滾,這樣第一次插入的正確數(shù)據(jù)也不會保存到數(shù)據(jù)庫
DBMS_OUTPUT.put_line('[PL/SQL 事務(wù)]中出現(xiàn)異常,錯誤代碼:ORA' || sqlcode);
-- 我們驗(yàn)證一下表里的數(shù)據(jù)為0條
SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;
DBMS_OUTPUT.put_line('回滾后,MY_TEST表中有' || V_COUNT || '條記錄');
END; -- 可執(zhí)行語句結(jié)束
/ -- 該符號表示執(zhí)行這段PL/SQL代碼
執(zhí)行后的輸出:
MY_TEST表中有1條記錄
[PL/SQL 事務(wù)]中出現(xiàn)異常,錯誤代碼:ORA-1722
回滾后,MY_TEST表中有0條記錄
相關(guān)閱讀:
在64位Win7系統(tǒng)下安裝Oracle 11g和Oracle SQL Developer客戶端 http://www.linuxidc.com/Linux/2012-11/74809.htm
總結(jié)
以上是生活随笔為你收集整理的mysql 事务块 sql_Oracle_PL/SQL的基本写法_BEGIN_END块结构及简单的事务实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdbc mysql 报错 ssl_My
- 下一篇: mysql show timestamp