1、SQL禁例
业务场景:存在下述的程序写法
Update TABLENAME set COLUMN = XXX where WHERES
IF 执行失败 THEN
提示窗口
ROLLBACK;
ELSE
COMMIT;
END IF;
要求请判断这种写法是否合适,并说明原因
2、数据并发
业务场景:存在以下表,其中状态为1的允许删除,状态为2的不允许删除
SALSTID(主键) GOODSID GOODSQTY STATE
1 78 60 1
2 89 79 2
3 33 80 2
要求:在考虑并发的情况下,给出上述删除处理的伪代码
业务场景:存在下述的程序写法
Update TABLENAME set COLUMN = XXX where WHERES
IF 执行失败 THEN
提示窗口
ROLLBACK;
ELSE
COMMIT;
END IF;
要求请判断这种写法是否合适,并说明原因
2、数据并发
业务场景:存在以下表,其中状态为1的允许删除,状态为2的不允许删除
SALSTID(主键) GOODSID GOODSQTY STATE
1 78 60 1
2 89 79 2
3 33 80 2
要求:在考虑并发的情况下,给出上述删除处理的伪代码
解决方案 »
- 本人安装9i和10g点set.up均无反应,求问题原题和解决办法和xp下Oracle下载链接。
- 简单的难题!?!?欢迎踊跃交流
- 关于oracle创建的用户未赋权就有DBA的权限
- 大家好,大家帮我看一下这个sql语句怎么写啊?
- pl/sql developer 建表时的分号问题
- 在线急等一个分析函数rank ver的问题,各位大侠请进
- 我的服务管理中怎么没有 OracleOraHome81ManagementServer
- 急,linux下oracle安装问题
- 关于NEW和OLD的问题请教!
- 求教,在oracle9i中,如何创建一个新的实例啊?(搜索过以前的,没有)在线等。。。
- 问一个创建表方面的问题
- 请教ORACLE的别名能不能进行运算。
对于异常要使用exception来捕获.
2.盲点,等高手.
1.不合适.Oracle里对异常的捕获采用exception方式 即:
BEGIN
Update TABLENAME set COLUMN = XXX where WHERES 。
COMMIT;
EXCEPTION WHEN others THEN
提示窗口
ROLLBACK;
END ; 2.可以创建trigger来实现:--举个例子:Connected to:
Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> CREATE TABLE del (SALSTID NUMBER, GOODSID NUMBER , GOODSQTY NUMBER , STATE NUMBER ) ;Table created.SQL> INSERT INTO del VALUES(1 ,78 ,60 ,1 );1 row created.SQL> INSERT INTO del VALUES(2 ,89 ,79 ,2 );1 row created.SQL> INSERT INTO del VALUES(3 ,33 ,80 ,2 );1 row created.SQL> SELECT * FROM del; SALSTID GOODSID GOODSQTY STATE
---------- ---------- ---------- ----------
1 78 60 1
2 89 79 2
3 33 80 2SQL> CREATE OR REPLACE TRIGGER trg_name
2 AFTER DELETE ON del
3 FOR EACH ROW
4 BEGIN
5 IF :OLD.state=2 THEN
6 Raise_Application_Error(-20002,'不可删除状态为2的记录!');
7 END IF;
8 END;
9 /Trigger created.
SQL> DELETE FROM del WHERE state=2;
DELETE FROM del WHERE state=2
*
ERROR at line 1:
ORA-20002: 不可删除状态为2的记录!
ORA-06512: 在 "UCNZP.TRG_NAME", line 3
ORA-04088: 触发器 'UCNZP.TRG_NAME' 执行过程中出错SQL> SELECT * FROM del; SALSTID GOODSID GOODSQTY STATE
---------- ---------- ---------- ----------
1 78 60 1
2 89 79 2
3 33 80 2SQL>
2
create or repalce trigger tri_del before delete on tb for each row
begin
if :old.STATE=2 then
RAISE_APPLICATION_ERROR(-20001,'不允许删除状态为2的记录');
end if;
end;