Oracle中使用函数、存储过程、触发器实现业务主键编号

现有以下学生表:

SQL> select * from t_stu;

SID      SNAME       CID
-------- ---------- ----

先需要对学生的学号进行定义,规则是两位年份+三位班级号+三位流水号(不够位数的用0补)。

 

在这里可以通过自定义一个函数来得到学号:

CREATE OR REPLACE FUNCTION f_get_stuno(p_cid NUMBER)
RETURN VARCHAR2
AS
  v_no VARCHAR2(8);
  v_count NUMBER;
BEGIN
  v_no := to_char(SYSDATE,'yy'); 
  v_no := v_no || lpad(p_cid,3,0);
  SELECT COUNT(*)+1 INTO v_count FROM t_stu WHERE cid=p_cid;
  v_no := v_no || lpad(v_count,3,0);
  RETURN v_no;
END;

 这样在存储过程中添加学生就可以直接调用:

CREATE OR REPLACE PROCEDURE sp_add_stu(
  p_sname t_stu.sname%TYPE,
  p_cid t_stu.cid%TYPE
)
AS
BEGIN
  INSERT INTO t_stu(sid,sname,cid)
  VALUES(f_get_stuno(p_cid),p_sname,p_cid);
  COMMIT;
END;
--测试
CALL sp_add_stu('a',2);

 使用触发器:

CREATE OR REPLACE TRIGGER tr_su_no
BEFORE INSERT
ON t_stu
FOR EACH ROW 
DECLARE
BEGIN
  :NEW.sid := f_get_stuno(:NEW.cid);
END;
--测试,只需执行普通SQL语句,该触发器就会被触发
INSERT INTO t_stu(sname,cid) VALUES('b',2);
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值