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 
要求:在考虑并发的情况下,给出上述删除处理的伪代码 

解决方案 »

  1.   

    1.不合理
      对于异常要使用exception来捕获.
    2.盲点,等高手.
      

  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> 
      

  3.   


    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;
      

  4.   

    thank you very much!!!!