① 存储过程记录日志怎么理解
您可以参考以下信息去理解:
存储过程存储了一系列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(自治事务),该存储过程中的提交或回滚只对该存储过程有效。自治事务的特点是不依赖主程序,也不干涉主程序。