`
chensunhao
  • 浏览: 11659 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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);
 

 

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics