操作数据库时,如果有大量相同的操作(比如查询语句),写很多重复的语句会显得繁琐。我们可以把这些操作写成函数,在需要的地方调用,可以更高效。
注意:创建函数可以直接执行创建函数的脚本,复制底下创建函数的例子要把注释去掉,否则函数创建不成功。
一、oracle自定义函数
格式:
CREATE OR REPLACE FUNCTION "数据库名称"."函数名"
(
参数一 [in,out] 类型,//参数有两种类型,in或者out;可以创建不带参数的函数
参数二 [in,out] 类型,
...
)
return 返回值类型
is
变量一 类型;//多个变量之间用;隔开
变量二 类型;
... ;
begin
/*给变量赋值的过程*/
return (变量一或变量二或...);
end;
举例:创建一个函数GETNAME(),根据输入的参数查询。
CREATE OR REPLACE FUNCTION GETNAME
(
AB01ZA0100 IN VARCHAR2
)
RETURN VARCHAR2 IS
pza0100 VARCHAR2 (50) ;
ID VARCHAR2 (50) ;
ab01name VARCHAR2 (50) ;
BEGIN
pza0100 := AB01ZA0100 ;//给变量赋值
SELECT //查询语句
NVL (ZA0101, '') INTO ab01name
FROM
AB01
WHERE
za0100 = pza0100 ;
RETURN (ab01name) ;//返回语句
END ;
调用:
SELECT
GETNAME ('013100A')
FROM
dual
二、mysql自定义函数
格式:
//开启数据库自定义函数功能
set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS "函数名"; //删除已存在的同名函数
DELIMITER $$ //定义分隔符,必须要有,可以不是$$
CREATE FUNCTION "数据库名称"."函数名"
(
参数一 类型,//多个参数用,分割
参数二 类型,
...
)
RETURNS 返回值类型//不确定返回文本长度,可以使用text
BEGIN
/*给变量赋值的过程*/
return (变量一或变量二或...);//一定要有返回语句
END $$ //这个end后面有前面定义的分割符号
DELIMITER $$
之所以使用 DELIMITER 是因为 MySQL 中默认是使用分号来结束一个命令,我们定义的函数体中一条命令写完时会用分号来结束,而MySQL会误以为函数体已经定义完成,因此我们需要定义一个新的标识符来标识一个命令的结束。
SET str = concat(str,s);
举例:还是上面那个函数,在 mysql 创建。
set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS GETNAME;
DELIMITER $$
CREATE FUNCTION GETNAME
(
AB01ZA0100 VARCHAR(20)
)
RETURNS VARCHAR (50)
BEGIN
DECLARE pza0100 VARCHAR (50);//声明要用到的变量
DECLARE ab01name VARCHAR (50);
SET pza0100 = concat(pza0100, AB01ZA0100) ; //赋值语句
SELECT //查询语句
IFNULL(ZA0101, '') INTO ab01name
FROM
AB01
WHERE
za0100 = pza0100 ;
RETURN (ab01name);//返回语句
END$$
DELIMITER $$
调用:
SELECT
GETNAME ('013100A')
三、总结
- 创建时需要替换之前的函数
--oracle
CREATE OR REPLACE FUNCTION "函数名";
--mysql
DROP FUNCTION IF EXISTS "函数名";
CREATE FUNCTION ...
- 函数体内用到局部变量
--oracle,在return后定义变量
CREATE OR REPLACE FUNCTION ...
return 返回值类型
is
变量一 类型;//多个变量之间用;隔开
变量二 类型;
... ;
--mysql,在函数体内定义变量
BEGIN
DECLARE var_name[,...] type [DEFAULT value]
END
- 函数体内的赋值语句
--oracle
方法一:
:= 直接赋值
演示:
a := 0;
方法二:
SELECT INTO 语句
演示:
select count(*) into a from students;
方法三:
execute immediate 变量名a into 变量名b
--变量名 a 一般是 select 语句
演示:
a := 'select count(*) from tb where id =: 1';
execute immediate a into b;
--mysql
方法一:
SET var_name=expr [, var_name=expr]...;
演示:
DECLARE var1, var2, var3 INT;
SET var1=10, var2=20;
SET var3=var1+var2;
方法二:
SELECT INTO 语句
演示:
DECLARE a VARCHAR(100);
DECLARE b DECIMAL(8,4);
SELECT aa,bb INTO a,b FROM ab01 WHERE id=1;