虽工作多年,但是sql的存储过程一致都没怎么用过,今天来按照博客https://www.cnblogs.com/applelife/p/11016674.html来学习一下(我使用postgre sql将这篇文章的例子都跑一遍)。

新建一张students表:

create table students(
id int primary key,
age int,
name varchar(20),
city varchar(20)
); insert into students values(1, 22, '赵四', '杭州');
insert into students values(2, 16, '刘能', '上海');
insert into students values(3, 20, '谢广坤', '深圳');
insert into students values(4, 21, '刘美兰', '北京');
insert into students values(5, 20, '宋晓峰', '湖北');
insert into students values(6, 21, '谢大脚', '江苏');
insert into students values(7, 20, '苏玉红', '天津');
insert into students values(8, 21, '陈艳兰', '云南');

数据如图:

1.不带参数的存储过程

create or replace function getAllCount() returns integer as $$
declare
rlt_str varchar;
begin
select into rlt_str count(*) from students;
return rlt_str;
end
$$
language plpgsql;

然后执行这个存储过程:

select getAllCount();

注意:这个写法和mysql的差别还蛮大的;存储过程必须先执行一次,然后在随时的调用。

2.带参数的存储过程

drop function queryById(id int4, out s_name text, out s_city text);

create or replace function queryById(id int4, out s_name text, out s_city text)
returns setof record as
$$
declare
rec record;
begin
for rec in execute 'select * from students where id = '||$1 loop
s_name := rec.name;
s_city := rec.city;
return next;
end loop;
end;
$$
language plpgsql; select * from queryById(1);

执行结果:

注意:这样查询记录还需要一个一个赋值;$1表示的是第一个参数; ||表示的字符串的拼接;record表示的是一条记录。

修改这个存储过程,查询出多个结果,这个时候是这样的。

create or replace function queryById(id int4, out s_name text, out s_city text)
returns setof record as
$$
declare
rec record;
begin
for rec in execute 'select * from students where age = '||$1 loop
s_name := rec.name;
s_city := rec.city;
return next;
end loop;
end;
$$
language plpgsql;

调用

select * from queryById(20);

执行结果:

总结:

pgsql的存储过程的一般写法:

CREATE OR REPLACE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型 AS
$BODY$
DECLARE
变量声明
BEGIN
函数体
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;

贴几个写法示例的博客:https://www.cnblogs.com/kuang17/p/8143814.html

SQL存储过程的学习01的更多相关文章

  1. 关于SQL SERVER数据库学习总结

    对于SQL SERFVER数据库也学了有一阵子了,自己也对自己所学做了一些总结. 我们首先学习数据库设计的一些知识点和用SQL语句建库. 设计数据库步骤:需求分析阶段,概要设计阶段,详细设计阶段, 建 ...

  2. SQL存储过程生成顺序编码

    一.第一种方式 USE [WJKC]GO/****** Object:  StoredProcedure [dbo].[Address_GetCode1]    Script Date: 2016/3 ...

  3. SQL存储过程概念剖析

    一.SQL存储过程的概念,优点及语法 定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execut ...

  4. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

  5. 《软件测试自动化之道》读书笔记 之 SQL 存储过程测试

    <软件测试自动化之道>读书笔记 之 SQL 存储过程测试 2014-09-28 待测程序测试程序   创建测试用例以及测试结果存储  执行T-SQL脚本  使用BCP工具导入测试用例数据  ...

  6. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  7. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  8. SQL存储过程分页(通用的拼接SQL语句思路实现)

    多表通用的SQL存储过程分页 案例一: USE [Community] GO /****** Object: StoredProcedure [dbo].[Common_PageList] Scrip ...

  9. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

随机推荐

  1. suging闲谈-netty 的异步非阻塞IO线程与业务线程分离

    前言 surging 对外沉寂了一段时间了,但是作者并没有闲着,而是针对于客户的需要添加了不少功能,也给我带来了不少外快收益, 就比如协议转化,consul 的watcher 机制,JAVA版本,sk ...

  2. IPMI日常使用

    重启ipmi: ipmitool mc reset  <warm|cold>  warm表示软重启: cold表示硬重启:   设置IPMI地址: ipmitool lan set 1 i ...

  3. pagehelper 自循环启动报错

    问题原因 问题产生的原因是 ServiceA实现类中引入了ServiceB,而在ServiceB实现类中又引入了ServiceA,导致循环依赖注入. 其实在代码开发过程中应该尽量避免这种操作的出现,即 ...

  4. java集合专题 (ArrayList、HashSet等集合底层结构及扩容机制、HashMap源码)

    一.数组与集合比较 数组: 1)长度开始时必须指定,而且一旦指定,不能更改 2)保存的必须为同一类型的元素 3)使用数组进行增加/删除元素-比较麻烦 集合: 1)可以动态保存任意多个对象,使用比较方便 ...

  5. AngularJS 打算开始学习

    作为朋友推荐给我的一款框架 个人感觉还不错  打算开始学习

  6. 【计理01组08号】SSM框架整合

    [计理01组08号]SSM框架整合 数据库准备 本次课程使用 MySQL 数据库.首先启动 mysql : sudo service mysql start 然后在终端下输入以下命令,进入到 MySQ ...

  7. [自动化]基于kolla-ansible部署的openstack自动化巡检生成xlsx报告

    自动化巡检介绍 此巡检项目在kolla-ansible部署的openstack环境上开发,利用ansible-playbook编排的功能,对巡检的任务进行编排和数据处理.主要巡检的对象有IaaS平台和 ...

  8. 答疑记录:jmeter从返回的html中提取指定内容

    返回的html(截取部分),要求从中提取:2022-02-22 13:46:15 <!-- 前面省略557行 --> <td>2022-02-22</td> < ...

  9. 有关SQL(2012)突然无法连接服务器的问题解答

    Sql Server无法启动的4中原因:(先得分析出问题所在) 原文地址:http://www.cnblogs.com/JiangLe/p/4000497.html SQL Server 无法启动的原 ...

  10. spring 中<ref parent="">标签是什么意思;ref标签与ref属性有什么不同;子容器如何引用父容器的bean

    spring的配置文件可能会有多个<property name="a" ref="b" />就是找当前配置文件里的bean 也就是id为b的 < ...