数据库学习(十二)— 自定义函数

目录

自定义函数

1.1 创建

1.1.1 语法

1.1.2 delimiter说明

1.1.3 范例:


若mysql自带的函数不符合自己的要求,可以自定义函数

自定义函数

1.1 创建

1.1.1 语法

命令行:

delimiter $$
create function 函数名称(参数列表) returns 返回类型
begin
sql语句
end
$$
delimiter;

Navicat:

1.1.2 delimiter说明

  • delimiter用于命令行里面,navicat不需要使用。
  • delimiter用于设置分割符,默认为分号
  • 在 "sql语句" 部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程,需要指定其它符号作为分割符,此处使用 $$,也可以使用其它字符。

解释: 

①、在mysql语句中,都是以分号来判断是否是一条或多条语句,如下语句:

mysql> select * from students
    ->
    -> ;
+-----------+----------+------+----------+------+-------+--------------------+
| studentNo | nane     | sex  | hometown | age  | class | card               |
+-----------+----------+------+----------+------+-------+--------------------+
| 001       | 王昭君   | 女   | 北京     |   20 | 1班   | 340322199001247654 |
| 002       | 诸易亮   | 男   | 上海     |   18 | 2班   | 340322199002242354 |
| 003       | 张飞     | 男   | 南京     |   24 | 3班   | 340322199003247654 |
| 004       | 白起     | 男   | 安徽     |   22 | 4班   | 340322199005247654 |
| 005       | 大乔     | 女   | 天津     |   19 | 3班   | 340322199004247654 |
| 006       | 孙测香   | 女   | 河北     |   18 | 1班   | 340322199006247654 |
| 007       | 百里玄闟 | 男   | 山西     |   20 | 2班   | 340322199087247654 |
| 008       | 小乔     | 女   | 河南     |   15 | 3班   | NULL               |
| 009       | 百里守约 | 男   | 湖南     |   21 | 1班   |                    |
| 010       | 妲己     | 女   | 广东     |   26 | 2班   | 340322199607247654 |
| 011       | 李白     | 男   | 北京     |   30 | 4班   | 340322199005267754 |
| 012       | 孙膑     | 男   | 新疆     |   26 | 3班   | 340322199000297655 |
+-----------+----------+------+----------+------+-------+--------------------+
12 rows in set (0.00 sec)

②、使用delimiter后, 用$$代替分号,使分号不能作为结束语句。(只在命令行中使用)

mysql> delimiter $$
mysql> select * from students;
    ->
    -> ;;
    ->
    -> $$
+-----------+----------+------+----------+------+-------+--------------------+
| studentNo | nane     | sex  | hometown | age  | class | card               |
+-----------+----------+------+----------+------+-------+--------------------+
| 001       | 王昭君   | 女   | 北京     |   20 | 1班   | 340322199001247654 |
| 002       | 诸易亮   | 男   | 上海     |   18 | 2班   | 340322199002242354 |
| 003       | 张飞     | 男   | 南京     |   24 | 3班   | 340322199003247654 |
| 004       | 白起     | 男   | 安徽     |   22 | 4班   | 340322199005247654 |
| 005       | 大乔     | 女   | 天津     |   19 | 3班   | 340322199004247654 |
| 006       | 孙测香   | 女   | 河北     |   18 | 1班   | 340322199006247654 |
| 007       | 百里玄闟 | 男   | 山西     |   20 | 2班   | 340322199087247654 |
| 008       | 小乔     | 女   | 河南     |   15 | 3班   | NULL               |
| 009       | 百里守约 | 男   | 湖南     |   21 | 1班   |                    |
| 010       | 妲己     | 女   | 广东     |   26 | 2班   | 340322199607247654 |
| 011       | 李白     | 男   | 北京     |   30 | 4班   | 340322199005267754 |
| 012       | 孙膑     | 男   | 新疆     |   26 | 3班   | 340322199000297655 |
+-----------+----------+------+----------+------+-------+--------------------+
12 rows in set (0.00 sec)

③、 自定义完函数需要改为分号结尾,否则后续其他语句无法以分号结尾

mysql> delimiter ;
mysql> select * from students;
+-----------+----------+------+----------+------+-------+--------------------+
| studentNo | nane     | sex  | hometown | age  | class | card               |
+-----------+----------+------+----------+------+-------+--------------------+
| 001       | 王昭君   | 女   | 北京     |   20 | 1班   | 340322199001247654 |
| 002       | 诸易亮   | 男   | 上海     |   18 | 2班   | 340322199002242354 |
| 003       | 张飞     | 男   | 南京     |   24 | 3班   | 340322199003247654 |
| 004       | 白起     | 男   | 安徽     |   22 | 4班   | 340322199005247654 |
| 005       | 大乔     | 女   | 天津     |   19 | 3班   | 340322199004247654 |
| 006       | 孙测香   | 女   | 河北     |   18 | 1班   | 340322199006247654 |
| 007       | 百里玄闟 | 男   | 山西     |   20 | 2班   | 340322199087247654 |
| 008       | 小乔     | 女   | 河南     |   15 | 3班   | NULL               |
| 009       | 百里守约 | 男   | 湖南     |   21 | 1班   |                    |
| 010       | 妲己     | 女   | 广东     |   26 | 2班   | 340322199607247654 |
| 011       | 李白     | 男   | 北京     |   30 | 4班   | 340322199005267754 |
| 012       | 孙膑     | 男   | 新疆     |   26 | 3班   | 340322199000297655 |
+-----------+----------+------+----------+------+-------+--------------------+
12 rows in set (0.00 sec)

1.1.3 范例:

要求:创建函数my_trim,用于删除字符串左右两侧的空格

命令行:

  • step1:设置分割符
delimiter $$
  • step2:创建函数
create function my_trim(str varchar(100)) retures varchar(108)
begin
return ltrim(rtrim(str));
end
$$
  • step3:还原分割符
delimiter ;

Navicat

  • step1:创建:
set global log_bin_trust_function_creators=TRUE;
create function my_trim(str varchar(100)) returns varchar(100)
begin
return ltrim(rtrim(str));
end

‼注意:创建时的报错问题:

不能直接自定义,

报错:

This function has none of DETERMINISTIC, NO SQL, 
or READS SQL DATA in its declaration 
and binary logging is enabled 
(you *might* want to use the less safe log_bin_trust_function_creators variable)

需要添加:

set global log_bin_trust_function_creators=TRUE;

参考:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法_永不放弃的地盘-CSDN博客

  • step2:使用:
select my_trim('   ABC    ')

 

在PG数据库中,要查询所有自定义函数,可以使用以下SQL语句: ```sql SELECT proname, proargnames, prosrc FROM pg_proc WHERE pronamespace = 'public'::regnamespace; ``` 这个查询语句会返回所有在"public"模式下定义的函数的名称、参数名称和函数体。你可以将这个查询语句作为一个SQL命令在PG数据库中执行,或者在PL/pgSQL函数中使用EXECUTE语句来执行这个查询并返回结果。 请注意,这个查询只会返回在"public"模式下定义的函数。如果你的自定义函数在其他模式下定义,你需要修改查询语句中的"public"为相应的模式名称。 \[1\]是一个关于在PG数据库中使用PL/pgSQL函数的问题的Stack Overflow链接,其中提供了一个示例函数的代码。 \[2\]是PG数据库的PL/pgSQL文档链接,其中提供了关于PL/pgSQL语言的详细描述。 \[3\]是一个关于在PG数据库中创建用户的函数的示例代码。 #### 引用[.reference_title] - *1* *2* [PG - 自定义SQL函数](https://blog.csdn.net/charles_neil/article/details/116677591)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PostgreSql | 数据库 |自定义函数的设计和实现](https://blog.csdn.net/alwaysbefine/article/details/130014577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值