1.函数
①系统函数
②自定义函数
③使用函数
④编写过程
⑤过程的调用
例子:一个数的两倍
CREATE OR REPLACE FUNCTION f_get_double
(
p1 NUMBER
)
RETURN NUMBER
IS
v1 NUMBER;
BEGIN
v1:=p1*2;
RETURN v1;
END;
调用:SELECT scott.f_get_double(100) FROM dual;
SELECT ename,sal,f_get_double(sal) AS sal2 FROM emp;
2.存储过程
例子:删除指定编号的员工信息,如果员工所在部门的人数少于三个就不能删除。
CREATE OR REPLACE PROCEDURE sp_del
(
v_empno emp.empno%TYPE
)
AS
v_count NUMBER;
BEGIN
DELETE FROM emp WHERE empno=v_empno;
SELECT COUNT(*) INTO v_count FROM emp
WHERE deptno=(
SELECT deptno FROM emp WHERE empno=deptno
);
IF(v_count<3)THEN
ROLLBACK;
raise_application_error(-20045,'部门人数太少!');
END IF;
dbms_output.put_line('删除了'||SQL%ROWCOUNT||'行');
COMMIT;
END;
3.函数与存储过程的区别:
①函数必须有返回值
②函数不能修改数据
③都有in out (in out)三个参数
4.常见函数举例
①Ltrim与Rtrim
SELECT RTrim('afesafdafeg','eg') FROM dual; --这里就是把右边的eg截断
SELECT LTrim('afesafdafeg','af') FROM dual; --这里就是把左边的af截断
②LPad与RPad
SELECT LPad('abcdefgtyi', 12, 'YY') FROM dual; --在列的左边粘贴字符,12表示 在'abcdefgtyi'出现的索引值,不够就补YY
上面的结果为:YYabcdefgtyi
SELECT RPad('abcdefgyui', 12, 'YY') FROM dual; --同上
结果为:abcdefgyuiYY
5.包的使用(可以看成是JAVA里的接口)
--先写包里定义函数,不写它的实现
CREATE OR REPLACE PACKAGE my_fun IS
FUNCTION f_get_double(a NUMBER) RETURN NUMBER;
END;
--包体
CREATE OR REPLACE PACKAGE BODY my_fun IS
FUNCTION f_get_double(a NUMBER) RETURN NUMBER
AS
BEGIN
RETURN a*2;
END;
END;
6.什么时候函数与存储过程
①不修改数据,只完成计算。用函数
②业务要涉及多个步骤或者多张表时,用存储过程
③而项目中函数和过程多,就用包来管理
①系统函数
②自定义函数
③使用函数
④编写过程
⑤过程的调用
例子:一个数的两倍
CREATE OR REPLACE FUNCTION f_get_double
(
p1 NUMBER
)
RETURN NUMBER
IS
v1 NUMBER;
BEGIN
v1:=p1*2;
RETURN v1;
END;
调用:SELECT scott.f_get_double(100) FROM dual;
SELECT ename,sal,f_get_double(sal) AS sal2 FROM emp;
2.存储过程
例子:删除指定编号的员工信息,如果员工所在部门的人数少于三个就不能删除。
CREATE OR REPLACE PROCEDURE sp_del
(
v_empno emp.empno%TYPE
)
AS
v_count NUMBER;
BEGIN
DELETE FROM emp WHERE empno=v_empno;
SELECT COUNT(*) INTO v_count FROM emp
WHERE deptno=(
SELECT deptno FROM emp WHERE empno=deptno
);
IF(v_count<3)THEN
ROLLBACK;
raise_application_error(-20045,'部门人数太少!');
END IF;
dbms_output.put_line('删除了'||SQL%ROWCOUNT||'行');
COMMIT;
END;
3.函数与存储过程的区别:
①函数必须有返回值
②函数不能修改数据
③都有in out (in out)三个参数
4.常见函数举例
①Ltrim与Rtrim
SELECT RTrim('afesafdafeg','eg') FROM dual; --这里就是把右边的eg截断
SELECT LTrim('afesafdafeg','af') FROM dual; --这里就是把左边的af截断
②LPad与RPad
SELECT LPad('abcdefgtyi', 12, 'YY') FROM dual; --在列的左边粘贴字符,12表示 在'abcdefgtyi'出现的索引值,不够就补YY
上面的结果为:YYabcdefgtyi
SELECT RPad('abcdefgyui', 12, 'YY') FROM dual; --同上
结果为:abcdefgyuiYY
5.包的使用(可以看成是JAVA里的接口)
--先写包里定义函数,不写它的实现
CREATE OR REPLACE PACKAGE my_fun IS
FUNCTION f_get_double(a NUMBER) RETURN NUMBER;
END;
--包体
CREATE OR REPLACE PACKAGE BODY my_fun IS
FUNCTION f_get_double(a NUMBER) RETURN NUMBER
AS
BEGIN
RETURN a*2;
END;
END;
6.什么时候函数与存储过程
①不修改数据,只完成计算。用函数
②业务要涉及多个步骤或者多张表时,用存储过程
③而项目中函数和过程多,就用包来管理