首页 > 其他分享 >9个MogDB存储过程示例

9个MogDB存储过程示例

时间:2024-04-15 11:12:55浏览次数:10  
标签:存储 Name 示例 CREATE MogDB genre openGauss Id PROCEDURE

9 个 MogDB 存储过程示例
本文出处:https://www.modb.pro/db/400634

存储过程是一组结构化的查询和语句,例如控制语句和声明。这里介绍 9 个在不同情况下很有用的存储过程示例。

创建测试表:

create table public.test1(id int,name varchar(10));

  1. 使用存储过程插入数据
    CREATE OR REPLACE PROCEDURE genre_insert_data(GenreId integer, Name character varying)
    AS
    begin
    INSERT INTO public.test1 VALUES (GenreId, Name);
    end;
    测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_insert_data(GenreId integer, Name character varying)
openGauss-# AS
openGauss$# begin
openGauss$# INSERT INTO public.test1 VALUES (GenreId, Name);
openGauss$# end;
openGauss$# /
CREATE PROCEDURE
openGauss=# call genre_insert_data(1,'aaa');
genre_insert_data

(1 row)

openGauss=# select * from test1;
id | name
----+------
1 | aaa
(1 row)
2. 在屏幕上显示消息
CREATE OR REPLACE PROCEDURE display_message (INOUT msg TEXT) AS BEGIN RAISE NOTICE 'Procedure Parameter: %', msg ; END ;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_insert_data(GenreId integer, Name character varying)
openGauss-# AS
openGauss$# begin
openGauss$# INSERT INTO public.test1 VALUES (GenreId, Name);
openGauss$# end;
openGauss$# /
CREATE PROCEDURE
openGauss=# call genre_insert_data(1,'aaa');
genre_insert_data

(1 row)

openGauss=# select * from test1;
id | name
----+------
1 | aaa
(1 row)
3.使用事务控制
CREATE OR REPLACE PROCEDURE control_transaction()
AS
DECLARE
BEGIN
CREATE TABLE test2 (id int);
INSERT INTO test2 VALUES (1);
COMMIT;
CREATE TABLE test3 (id int);
INSERT INTO test2 VALUES (1);
ROLLBACK;
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE control_transaction()
openGauss-# AS
openGauss$# DECLARE
openGauss$# BEGIN
openGauss$# CREATE TABLE test2 (id int);
openGauss$# INSERT INTO test2 VALUES (1);
openGauss$# COMMIT;
openGauss$# CREATE TABLE test3 (id int);
openGauss$# INSERT INTO test2 VALUES (1);
openGauss$# ROLLBACK;
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# select * from test2;
ERROR: relation "test2" does not exist on dn_6001
LINE 1: select * from test2;
^
openGauss=# call control_transaction();
control_transaction

(1 row)
openGauss=# select * from test2;
id

1
(1 row)
openGauss=# select * from test3;
ERROR: relation "test3" does not exist on dn_6001
LINE 1: select * from test3;
^
在这里我们可以看到提交之前的数据是可用的,但是没有提交和回滚的数据会从数据库中删除。

4.使用列数据类型
CREATE OR REPLACE PROCEDURE genre_id_max() AS
DECLARE
Genreid test1.Id%type;
BEGIN
select max(Id) into Genreid from public.test1;
RAISE NOTICE 'Maximum of GenreId is : %', Genreid ;
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_id_max() AS
openGauss$# DECLARE
openGauss$# Genreid test1.Id%type;
openGauss$# BEGIN
openGauss$# select max(Id) into Genreid from public.test1;
openGauss$# RAISE NOTICE 'Maximum of GenreId is : %', Genreid ;
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# call genre_id_max();
NOTICE: Maximum of GenreId is : 1
genre_id_max

(1 row)
5. 发出 NOTICE、WARING 和 INFO 消息
CREATE OR REPLACE PROCEDURE raise_warning() AS
DECLARE
warn INT := 10;
BEGIN
RAISE NOTICE 'value of warn : % at %: ', warn, now();
warn := warn + 10;
RAISE WARNING 'value of warn : % at %: ', warn, now();
warn := warn + 10;
RAISE INFO 'value of warn : % at %: ', warn, now();
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE raise_warning() AS
openGauss$# DECLARE
openGauss$# warn INT := 10;
openGauss$# BEGIN
openGauss$# RAISE NOTICE 'value of warn : % at %: ', warn, now();
openGauss$# warn := warn + 10;
openGauss$# RAISE WARNING 'value of warn : % at %: ', warn, now();
openGauss$# warn := warn + 10;
openGauss$# RAISE INFO 'value of warn : % at %: ', warn, now();
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# call raise_warning();
NOTICE: value of warn : 10 at 2022-05-07 14:35:24.810364+08:
WARNING: value of warn : 20 at 2022-05-07 14:35:24.810364+08:
INFO: value of warn : 30 at 2022-05-07 14:35:24.810364+08:
raise_warning

(1 row)
6. 引发异常
CREATE OR REPLACE PROCEDURE genre_id_exception() AS
DECLARE
Genreid test1.Id%type ;
BEGIN
select max(Id) into Genreid from public.test1;
RAISE EXCEPTION 'Maximum of GenreId is : %', Genreid USING HINT = 'Test For Raising exception.';
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_id_exception() AS
openGauss$# DECLARE
openGauss$# Genreid test1.Id%type ;
openGauss$# BEGIN
openGauss$# select max(Id) into Genreid from public.test1;
openGauss$# RAISE EXCEPTION 'Maximum of GenreId is : %', Genreid USING HINT = 'Test For Raising exception.';
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# call genre_id_exception();
ERROR: Maximum of GenreId is : 1
7. 使用 FOR 循环遍历表中的数据
CREATE OR REPLACE PROCEDURE genre_traverse() AS
DECLARE
genre_rec record;
BEGIN
for genre_rec in (select Id,Name from public.test1 order by 1)
loop
RAISE NOTICE 'Id is : % , Name is : %', genre_rec.Id,genre_rec.Name;
end loop;
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_traverse() AS
openGauss$# DECLARE
openGauss$# genre_rec record;
openGauss$# BEGIN
openGauss$# for genre_rec in (select Id,Name from public.test1 order by 1)
openGauss$# loop
openGauss$# RAISE NOTICE 'Id is : % , Name is : %', genre_rec.Id,genre_rec.Name;
openGauss$# end loop;
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# call genre_traverse();
NOTICE: Id is : 1 , Name is : aaa
NOTICE: Id is : 1 , Name is :
genre_traverse

(1 row)
8. 使用 SECURITY INVOKER
SECURITY INVOKER 指示该过程将以调用它的用户的权限执行。这是默认设置。

CREATE OR REPLACE PROCEDURE genre_traverse() SECURITY INVOKER
AS
DECLARE
genre_rec record;
BEGIN
for genre_rec in (select Id,Name from public.test1 order by 1)
loop
RAISE NOTICE 'Genre Id is : % , Name is : %', genre_rec.Id,genre_rec.Name;
end loop;
END;
测试:

openGauss=# CREATE OR REPLACE PROCEDURE genre_traverse() SECURITY INVOKER
openGauss-# AS
openGauss$# DECLARE
openGauss$# genre_rec record;
openGauss$# BEGIN
openGauss$# for genre_rec in (select Id,Name from public.test1 order by 1)
openGauss$# loop
openGauss$# RAISE NOTICE 'Genre Id is : % , Name is : %', genre_rec.Id,genre_rec.Name;
openGauss$# end loop;
openGauss$# END;
openGauss$# /
CREATE PROCEDURE
openGauss=# \c - test
Password for user test:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "test".
openGauss=> call genre_traverse();
ERROR: permission denied for relation test1
DETAIL: N/A
CONTEXT: PL/pgSQL function genre_traverse() line 4 at FOR over SELECT rows
9. 使用 SECURITY DEFINER
SECURITY DEFINER 指定该过程将以拥有它的用户的权限执行。SECURITY DEFINER 过程不能执行事务控制语句(例如,COMMIT 和 ROLLBACK,取决于语言)。

在此示例中,我们使用用户“postgres”创建了一个存储过程,并使用无权访问该表的“test”用户调用它。

CREATE OR REPLACE PROCEDURE genre_traverse() SECURITY DEFINER
AS
DECLARE
genre_rec record;
BEGIN
for genre_rec in (select Id,Name from public.test1 order by 1)
loop
RAISE NOTICE 'Genre Id is : % , Name is : %', genre_rec.Id,genre_rec.Name;
end loop;
END;
测试:

(1 row)

标签:存储,Name,示例,CREATE,MogDB,genre,openGauss,Id,PROCEDURE
From: https://www.cnblogs.com/helloopenGauss/p/18135497

相关文章

  • Java调用第三方接口获取数据并存储,思路加代码
    思路:1.根据第三方接口返回的字段来创建实体类,用来接收数据2.建立连接,提供两种方式。来获取数据3.实体类转换并存储方法一:URL建立连接进行接收数据依赖<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifa......
  • 通过Supplier创建对象示例
    通过Supplier接口创建对象,具体code如下:packagecom.gientech.supplier;publicclassCar{privateStringname;publicCar(){}publicCar(Stringname){this.name=name;}publicStringgetName(){returnname;......
  • 如何编写易于访问的技术文档 - 最佳实践与示例
    当你为项目或工具编写技术文档时,你会希望它易于访问。这意味着它将为全球网络上的多样化受众提供服务并可用。网络无障碍旨在使任何人都能访问网络内容。设计师、开发人员和撰写人员有共同的无障碍最佳实践。本文将涵盖一些创建技术内容的最佳实践。(本文视频讲解:java567.com)什......
  • MySQL-09-mysql 存储过程入门介绍
    拓展阅读MySQL00ViewMySQL01Rulermysql日常开发规范MySQL02truncatetable与delete清空表的区别和坑MySQL03Expression1ofORDERBYclauseisnotinSELECTlist,referencescolumnMySQL04EMOJI表情与UTF8MB4的故事MySQL05MySQL入门教程(MySQLtutor......
  • 学习 GitHub 风格的 Markdown 语法和格式化 - 带有示例
    Markdown是一种轻量级、开源、易读易写的文本格式化方法,你可以在任何IDE或编辑器中将其作为纯文本使用。在GitHub上写作时,你可以使用Markdown语法和HTML元素来扩展Markdown的功能。你可以在GitHub的各个地方使用Markdown语法,比如README文件、wiki、评论、拉取请......
  • (PVE)添加硬盘做存储
    wget-q-O/root/pve_source.tar.gz'https://bbs.x86pi.cn/file/topic/2023-11-28/file/01ac88d7d2b840cb88c15cb5e19d4305b2.gz'&&tarzxvf/root/pve_source.tar.gz&&/root/./pve_source用fdisk-l去确认fdisk/dev/sda先分区,输入n(分区)-输入p(主分......
  • SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第10章 存储过程 读书笔记
    第10章存储过程 >.存储过程概述存储过程(storedprocedure)是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元来处理.存储过程取代了传统的逐条执行SQL语句的方式.一个存储过程中可以包含增删改查等一系列SQL语句,当这个存储过程被调用时,这些操作也......
  • 通过IKE协商方式建立IPSec隧道示例
    通过IKE协商方式建立IPSec隧道示例一、组网需求如图所示,HX为企业分支网关,GY为企业总部网关,分支与总部通过公网建立通信。分支子网为10.1.2.0/24,总部子网为10.1.1.0/24。GY和HX两个站点用户均可以正常访问互联网2.2.2.2。企业希望对分支子网与总部子网之间相互访问的流量进行安......
  • 快速获取MD3800i存储管理口IP地址的方法
    快速获取MD3800i存储管理口IP地址的方法打开抓包软件wireshark,选取抓包网卡后,用笔记本电脑随便设置个IP地址,笔记本网口网线直连MD3800i管理口网口,等待一会就能看到DHCP信息,是MD3800i请求获取DHCP。获取不到DHCP分配的IP后,MD3800i会改成存储默认IP地址,会发ARP包。用抓包软件直接能......
  • 采用手工方式建立IPSec隧道示例
    配置采用手工方式建立IPSec隧道示例一、组网需求如图所示,HX为企业分支网关,GY为企业总部网关,分支与总部通过公网建立通信。分支子网为10.1.2.0/24,总部子网为10.1.1.0/24。GY和HX两个站点用户均可以正常访问互联网2.2.2.2。企业希望对分支子网与总部子网之间相互访问的流量进行安......