oracle与mysql创建自定义函数

操作数据库时,如果有大量相同的操作(比如查询语句),写很多重复的语句会显得繁琐。我们可以把这些操作写成函数,在需要的地方调用,可以更高效。

注意:创建函数可以直接执行创建函数的脚本,复制底下创建函数的例子要把注释去掉,否则函数创建不成功。

一、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')

三、总结

  1. 创建时需要替换之前的函数
--oracle
CREATE OR REPLACE FUNCTION "函数名";

--mysql
DROP FUNCTION IF EXISTS "函数名";
CREATE FUNCTION ...
  1. 函数体内用到局部变量
--oracle,在return后定义变量
CREATE OR REPLACE FUNCTION ...
return 返回值类型
is
	变量一 类型;//多个变量之间用;隔开
	变量二 类型;
	... ;

--mysql,在函数体内定义变量
BEGIN
	DECLARE var_name[,...] type [DEFAULT value] 
END
  1. 函数体内的赋值语句
--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;

猜你喜欢

转载自blog.csdn.net/weixin_38673554/article/details/86627587
今日推荐