① 存儲過程記錄日誌怎麼理解
您可以參考以下信息去理解:
存儲過程存儲了一系列sql語句
存儲過程的需求場景:下邊是一個經典的需求場景,很多Mysql的書都有:
存儲過程存儲了一系列sql語句,使得簡化了操作,不要求重復執行一系列操作。只需要在需要的時候調用一下存儲過程就行了。
一般來說,可以認為存儲過程的功能與函數的功能類似(應該都學過函數吧),但只是要注意存儲過程沒有返回值,所以可以依據函數可用場景來理解存儲過程。
② SQL觸發器,當表中有新行插入時,則立即更新該行的某列值
create or replace trigger tr_test before insert on test for each rowdeclarebegin :new.c:= :new:c+1;end ;
樓上的回答不正確,因為在插入之後(未提交)再次進行修改本行記錄,會提示錯誤。如果非要在插入之後在修改的話,那麼可以用自治事務來實現,但是我還是覺得在插入之前更新插入的值更好,不用插入、修改。
③ oracle plsql什麼時候使用自治事務
了解oracle自治事務
1、什麼是Oracle自治事務
在官方文檔中,是這樣的定義的「Autonomous transactions are independent transactions that can be called from within another transaction.」就是說它被一個事務調用的事務,但它獨立於它的父事務提交或回滾。
下面看一個例子
首先創建一張測試表
www.2cto.com
[sql]
MIKE@ORA11G> create table test(m varchar2(30));Table created.
創建兩個procere,一個是自治事務的,一個是非自治事務的[sql]
create or replace procere auto_proce
as
pragma autonomous_transaction;
begin
insert into test values('autonomous!');
commit;
end;
/
[sql]
create or replace procere nonauto_proceas www.2cto.com
begin
insert into test values('nonautonomous!');commit;
end;
/
先調用nonauto_proce,看一下會發生什麼?
[sql]
SQL> select * from test;
未選定行
SQL> begin
2 insert into test values('test');
3 nonauto_proce;
4 rollback;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
test
nonautonomous!
第4行的rollback並沒有回滾,由於nonauto_proce過程不是自治事務,它的提交將父事務中的insert一並提交,造成rollback沒有回滾,即nonauto_proce影響了它的父事務。
下面再看一下auto_proce的情況。
[sql]
SQL> truncate table test;
表被截斷。
SQL> select * from test;
未選定行
SQL> begin
2 insert into test values('test1');
3 auto_proce;
4 rollback;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
autonomous!
由於auto_proce過程是自治事務,它的commit並沒有影響到其父事務的rollback。從結果中,已經證明了這一點。
通過這個例子,可以看出自治事務對其父事務並不會造成任何影響。
自治事務一般會被用於:
a 匿名塊
b 本地、對立或打包的函數或過程
c 對象類型的方法
d 觸發器
2、自治事務與父事務(調用者)的關系
創建一個過程,在commit前休眠10秒,以便查看系統中的一些信息。
[sql]
create or replace procere auto_p1
as
pragma AUTONOMOUS_TRANSACTION;
begin
insert into test values('test2');
dbms_lock.sleep(10);
commit;
end;
查看會話的SID(會話A)
www.2cto.com
[sql]
SQL> conn sys/admin as sysdba
已連接。
SQL> select sid from v$mystat where rownum=1;SID
----------
144
通過sqlplus打開另一個連接(會話B),查看會話信息[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------138 ACTIVE143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE159 ACTIVE160 ACTIVE161 ACTIVEwww.2cto.com
在會話A執行auto_p1
[sql]
SQL> begin
2 auto_p1;
3 end;
4 /
PL/SQL 過程已成功完成。
執行期間在會話B,查看會話信息
[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE160 ACTIVE161 ACTIVE162 ACTIVE163 ACTIVE並沒有看到新的會話產生,即自治事務auto_p1與其父事務(匿名塊)在同一會話中。
www.2cto.com
3、應用場景
在Tom大師的《Oracle編程藝術》中,提到了這方面的內容 – 記錄錯誤日誌或者消息。想想做過的項目中,的確自治事務主要應用在這方面比較多,不管你的請求是否成功,只要訪問到資料庫,就要記錄在案,使用自治事務是一種比較不錯的方案(當然還有其他方案,因為此處只說自治事務,其他方案略過)。
還有隊列消息等基礎資料庫的消息類系統,也可以使用自治事務來記錄消息的發送,實際上也是日誌的記錄。
下面使用一個簡單的例子,說明一下。
創建兩張表,一張測試表(有主鍵),一張是測試表的錯誤日誌信息表。
[sql]
SQL> create table test1
( id number(8),
msg varchar2(10),
constraint test1_pk primary key(id)
);
表已創建。
[sql]
SQL> create table test1_log
2 ( dat timestamp,
3 err clob
4 );
表已創建。
創建自治事務,用於記錄操作測試表時出現的錯誤信息。
[sql]
SQL> create or replace procere log_err(errinfo varchar2)2 as
3 pragma autonomous_transaction;
4 begin
5 insert into test1_log values(systimestamp, errinfo);6 commit;
7 end;
8 / www.2cto.com
過程已創建。
創建一個過程用於向測試進行插入操作。
[sql]
SQL> create or replace procere insert_test(numid number, msg varchar2)2 as
3 begin
4 insert into test1 values (numid, msg);5 end;
6 /
過程已創建。
向測試表插入數據(沒有錯誤信息的情況)。
[sql]
SQL> begin
2 insert_test(1,'testtest');
3 insert_test(2,'test');
4 exception
5 when others
6 then
7 log_err(dbms_utility.format_error_backtrace);8 raise;
9 end;
10 /
PL/SQL 過程已成功完成。
[sql]
SQL> select * from test1_log;
www.2cto.com
未選定行
錯誤日誌表中沒有信息,測試表中的數據都是正確的。
下面再進行插入操作(違反測試表的主鍵約束,出現錯誤的情況)。
[sql]
SQL> begin
2 insert_test(1,'ffffffff');
3 exception
4 when others
5 then
6 log_err(dbms_utility.format_error_backtrace);7 raise;
8 end;
9 /
begin
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (SYS.TEST1_PK)ORA-06512: 在 line 7
[sql]
SQL> set linesize 1000
SQL> select * from test1_log;
www.2cto.com
DAT
ERR--------------------------------30-7月 -12 07.55.26.281000 下午 ORA-06512: 在 "SYS.INSERT_TEST", line 4ORA-06512: 在 line 2
插入操作沒有成功,測試表沒有新插入的數據,但是錯誤日誌表中,記錄個這次插入操作的錯誤信息。
上面的例子非常簡單,運用到應用系統中,還需要根據系統的需求進行改造。
④ mysql資料庫 事務提交怎麼處理
查看 MySQL 客戶端的事務提交方式命令:select @@autocommit;
修改 MySQL 客戶端的事務提交方式為手動提交命令:set @@autocommit = 0;
(註:0 表示手動提交,即使用 MySQL 客戶端執行 SQL 命令後必須使用commit命令執行事務,否則所執行的 SQL 命令無效,如果想撤銷事務則使用 rollback 命令。1 表示自動提交,即在 MySQL 客戶端不在需要手動執行 commit 命令。)
MySQL 在自動提交模式下,每個 SQL 語句都是一個獨立的事務。
注意:
1、手動設置set @@autocommit = 0,即設定為非自動提交模式,只對當前的mysql命令行窗口有效,打開一個新的窗口後,默認還是自動提交;
2、對於非自動提交模式,比如在命令行中添加一條記錄,退出命令行後在重新打開命令行,之前插入的記錄是不在的。(用select * from + 表名 驗證一下就可以了)
⑤ Mysql資料庫中,事務是指什麼如何使用該功能
MySQL 事務
什麼是事務?
MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支持事務。
事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
隔離性:資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串列化(Serializable)。
持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
from 樹懶學堂 - 一站式數據知識平台
⑥ oracle,如何保證向表A插入數據失敗時,向表B插入一條失敗記錄(此條記錄必能插入,不允許失敗)
這個可能是需要使用 Oracle 的 自治事務 的處理機制了。
也就是 如果向t_test插入數據,如果插入失敗 , 那麼 插入t_test 的數據就回滾掉了。
但是插入t_state 又需要是提交的。
那麼插入t_state 的處理代碼, 使用自治事務 的處理機制。
無論向t_test插入數據, 結果是 提交了, 或者回滾了, 插入t_state 的事務,都提交。
問題就在於,你這個情況, 有點特殊, 是 失敗了, 才插入t_state表。
這樣,就沒法簡單的使用 BEFORE 觸發器來進行 t_state表的插入 處理。
那麼你那裡只能寫2個存儲過程。
一個是 使用自治事務 的, 插入 t_state表 的存儲過程。 (這個存儲過程, 用於發生異常的時候去調用)
一個是插入t_tes 的存儲過程, 增加 錯誤捕獲的代碼, 當發生異常的時候, 調用前面那個存儲過程。
下面是部分例子代碼
首先是 關於自治事務 的例子代碼
SQL>select*fromtest_main;
IDVALUE
------------------------------
2TWO
3THREE
1ONE
SQL>_Insert
2AS
3--定義「自治事務」
4PRAGMAAUTONOMOUS_TRANSACTION;
5BEGIN
6INSERTINTOtest_main(id,value)VALUES(5,'FIVE');
7COMMIT;
8END;
9/
Procerecreated.
SQL>BEGIN
2--非自治事務的語句.
3INSERTINTOtest_main(id,value)VALUES(4,'FOUR');
4--自治事務
5Autonomous_Insert;
6--非自治事務回滾,不影響自治事務.
7rollback;
8END;
9/
PL/.
SQL>select*fromtest_main;
IDVALUE
------------------------------
5FIVE
2TWO
3THREE
1ONE
然後是關於 異常捕獲的例子代碼
SQL> DECLARE
2 p_test_val INT;
3 BEGIN
4 -- 導致一個 除零錯誤
5 p_test_val := 1024 / 0;
6 dbms_output.put_line(TO_CHAR(p_test_val));
7
8 EXCEPTION
9 WHEN OTHERS THEN
10 -- 異常自己處理
11 dbms_output.put_line('Exception Happen!');
12 END;
13 /
Exception Happen!
PL/SQL procere successfully completed.
⑦ 請問資料庫要如何保密
1、思路:在需要加密欄位的表中,增加對應的加密後的密文欄位。
例如表users中有欄位salary需要加密,則增加新欄位encrypted存放加密後的內容,而原salary的內容設為0值或者刪除。
2、具體來說:編寫PL/SQL代碼,主要是產生密鑰和提供加密解密的function,其中加密解密的function調用Oracle8i提供的數據加密包:dbms_obfuscation_toolkit。
從而使數據得到加解密。
3、測試案例:
(1)、新建了一個SWING的單屏幕,在SF_POST_QUERY_OF_EACH_ROW()方法中調用Oracle已經建立好的function,對解密欄位進行解密之後,再顯示屏幕相應的欄位上。
(2)、當進行insert或者update存檔,在SF_POST_DATABASE_COMMIT()方法中,調用加密function進行加密,然後存入資料庫。
4、遇到的問題:
(1)查詢的時候,由於在SF_POST_QUERY_OF_EACH_ROW()方法中解密後,又往屏幕中欄位進行了set動作,導致屏幕的狀態改變,最終導致屏幕存檔後會出現數據錯誤。
(2)這樣做的效率比較低,因為每次都要在Java程序里調用解密,存檔時調用加密。
Oracle規定,不能對trigger的觸發表進行操作。
還有,如果用自治事務去實現,同樣在update動作的時候會造成dead lock發生。
⑧ oracle PL-SQL實戰教程的教程目錄
第1講PL/SQL的前世今生
第2講PL/SQL基礎
第3講PL/SQL應用開發
第4講PL/SQL應用開發之子程序
第5講PL/SQL應用開發之包
第6講PLSQL觸發器(上)
第7講PLSQL觸發器(下)
第8講PLSQL高級應用之條件編譯
第9講PLSQL高級應用之本地編譯和加密解密API
第10講PLSQL高級應用之NOCOPY和Wrap
第11講PLSQL高級應用之自治事務
第12講PLSQL高級應用之面向對象(上)
第13講PLSQL高級應用之面向對象(下)
第14講PLSQL高級應用之動態SQL(上)
第15講PLSQL高級應用之動態SQL(下)
第16講PLSQL高級應用之BULK-COLLECT
第17講PLSQL高級應用之Java和C
第18講PLSQL高級應用之Trace-PLSQL執行
第19講PLSQL高級應用之Profiler
第20講PLSQL高級應用之細粒度訪問(FGAC)
第21講PLSQL高級應用之DBMS包
第22講PLSQL高級應用之正則表達式
第23講PLSQL高級應用之分析函數
第24講PLSQL高級應用之性能優化
第25講PLSQL高級應用之計劃任務(上)
第26講PLSQL高級應用之計劃任務(下)
第27講PLSQL高級應用之SQL優化(一)
第28講PLSQL高級應用之SQL優化(二)
第29講PLSQL高級應用之SQL優化(三)
第30講PLSQL高級應用之SQL優化(四)
第31講PLSQL高級應用之SQL優化(五上)
第32講PLSQL高級應用之SQL優化(五下)
第33講PLSQL高級應用之SQL優化(六)
第34講PLSQL高級應用之10個開發建議
第35講PLSQL高級應用之11g在性能優化方面的改善
第36講PLSQL高級應用之10g在等待事件方面的增強
第37講PLSQL高級應用之理解鎖競爭
第38講PLSQL高級應用之PLSQL小工具
第39講PLSQL最差實踐
⑨ sql server 執行自定義存儲過程有哪些方法
比如,建立了一個
存儲過程
「procName」。
第一種情況:不用exec的
create
table
()..
GO
--注意這里的GO
表示要開始下一個事務了
procName
--這里直接使用存儲過程名字
就是調用了
第二種情況:一定要使用
exec的
create
table()
exec
procName
--看這里,它不是作為這個事務的第一句開始的
所以要帶上exec
備註:不帶
exec的執行存儲過程必須是事務的第一句
。
⑩ Oracle資料庫自治事務有何特點
在創建存儲過程時加上pragma autonomous_transaction(自治事務),該存儲過程中的提交或回滾只對該存儲過程有效。自治事務的特點是不依賴主程序,也不幹涉主程序。