现有以下学生表:
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);