虽然现在postgresql的使用率不错,但是现在关于它的教程还是很少,而教程中对于存储过程的讲解也不详细,今天就自己的使用经验说一说。
创建存储过程很简单,create or replace function test(),当然,你如果这样写:create function test()也可以,但如果test()已存在就会报错,第一种写法是创建或覆盖,就是无论有没有都创建test()。这个是不带参数的,那如果带参数的存储过程呢?这样:create or replace function test(name varchar),存储过程参数的数据类型要放在参数名的后面,现在来创建一个简单的存储过程。
create or replace function test(name varchar) returns varhcar as
$$
declare
str varchar;
str2 varchar;
begin
str = name;
str2 = name || ' is ' || $1;
return str2;
end
$$
language plpgsql;
执行它:select test('postgresql'),返回的是一个字符串’postgresql is postgresql',这里对这个存储过程介绍一下,首先returns varchar定义一个返回类型,说明返回varchar类型的数据,$$符号把存储过程包围起来,更便于存储过程的识别,declare是声明变量,而函数体都在begin和end之间,name是代表参数name,而$1也是代表name,它是指存储过程的第一个参数,$2是指第二个参数,在存储过程里,字符串的相加用的||,中间要用空格,如果是常量,那要用两个'来包含起来,如果我需要字符',那怎么办?那还是用两个'包含起来,注意,'是关键符号,所以要用两个'来表示一个',所以用四个'可以表示一个'字符。
现在来说一说在存储过程里对数据库的一些操作。
第一:select into
使用select into可以查询数据库,看一个例子:
create or replace function selectinto() returns varchar as
$$
declare
name varchar;
begin
select into name num from test;
return name;
end
$$
language plpgsql;
把表test里的num赋给变量name,然后返回,这里返回的是第一条记录的num。
如果查询语句里有未知的参数,那要怎么办?这样用select into就不能满足要求了。把上面的存储过程修改一下:
create or replace function selectinto(num int4) returns varchar as
$$
declare
sql varchar;
begin
sql = 'select * from test where num=' || num;
execute sql;
end
$$
language plpgsql;
当要查询所有记录,然后循环取的想要的值,这要用到记录类型record.
create or replace function selectinto(num int4) returns varchar as
$$
declare
sql varchar;
str varchar;
re record;
begin
sql = 'select name from test where num=' || num;
for re in execute sql loop
str = str + re.name;
end loop;
return str;
end
$$
language plpgsql;
在for循环里是可以嵌套for循环的,省力一点,下面贴个自己写的存储过程:
create or replace function checknum(lpbh varchar,zzxsid varchar,xqr varchar,qzrs int4,xql int4,id int4) returns varchar as
$$
declare
s varchar; ----用来接收存储过程insert_checknum的返回结果
dt date; ----需求日
dt2 date; ----起排日
dt3 date; ----今天的日期
dt4 date; ----排产日
res record;
a int4; ----某个制造形式ID的产能
i int4; ----起排日到今天的天数
j int4; ----从起排日开始算某个只在形式ID的产能累计
sql varchar;
begin
----如果传入的参数有一个为空,则返回0
if(lpbh is null or zzxsid is null or xqr is null or qzrs is null or xql is null or id is null) then
return 0;
end if;
dt = $3;
dt2 = dt - $4 - 1;
dt3 = now();
dt4 = dt2;
i = dt2 - dt3;
j = 0;
----查询某个制造形式ID的产能
sql = 'select fld_abm26563 from abm4045 where fld_abm26561=' || '''' || zzxsid ||'''';
for res in execute sql loop
a = res.fld_abm26563;
end loop;
for n in 1..i loop
j = j + a;
----查询产能记录单里有没有和dt4对应的产能记录数据
sql = 'select * from abm4047 where fld_abm26579=' || '''' || dt4 || ''' and fld_abm26583=' || '''' || zzxsid || '''';
for res in execute sql loop
if(res.fld_abm26584 is not null) then
j = j - res.fld_abm26584;
end if;
if(res.fld_abm26585 is not null) then
j = j + res.fld_abm26585;
end if;
end loop;
----查询临时产能记录表temprecord里有没有和当天对应的产能记录
sql = 'select * from temprecord where pcr=' || '''' || dt4 || ''' and zzxsid=' || '''' || zzxsid || ''' and id=' || id;
for res in execute sql loop
if(res.pcl is not null) then
j = j - res.pcl;
end if;
end loop;
dt4 = dt2 - n;
----如果累计产能已能满足需求量,那么返回排产日
if(j>=xql) then
s = insert_checknum(lpbh,zzxsid,xqr,qzrs,xql,id);
return dt4 + 1;
end if;
end loop;
return 0;
end
$$
language plpgsql;
这个存储过程里调用了另一个存储过程insert_checknum(),这里insert_checknum的代码没有贴出来,这里是用做一个存储过程怎么调用另一个存储过程的例子。
相关推荐
本篇文章将详细介绍如何利用存储过程来实现九九乘法表的生成,这种方法非常适合初学者学习。 #### 存储过程的概念 存储过程是存储在服务器上的预先编写的SQL语句集合,它可以在客户端或应用程序请求时被调用执行。...
本文档将详细介绍PgSQL 到 MySQL 数据库迁移的步骤和注意事项。 Step 1: 使用 DBConvert 工具将 PgSQL 数据库中的表结构和数据转至 MySQL 数据库中 在使用 DBConvert 工具时,需要填写必要的信息,然后点击 next,...
本文将详细介绍如何在MySQL中创建一个存储过程来实现这一功能。 #### 核心概念解析 1. **经纬度**:用于表示地球表面某一位置的坐标。纬度范围是-90°到90°,经度范围是-180°到180°。 2. **存储过程**:MySQL中...
tsql2pgsql是一款非常实用的工具,主要用于帮助数据库管理员和开发者将TSQL(SQL Server的存储过程语言)转换为PL/PGSQL(PostgreSQL的存储过程语言)。在SQL Server和PostgreSQL之间进行迁移时,这个工具能显著减轻...
本文将深入探讨PostgreSQL中的CURD操作以及存储过程,并结合jdbc、hibernate、ibatis三种不同的Java数据访问技术进行讲解。 **一、CURD操作** 1. **创建(Create)**:在PostgreSQL中,创建表是最基本的操作。例如,...
PostgreSQL PL / pgSQL存储过程代码覆盖率 目的 PL / pgSQL并没有太多的开发人员工具,当您知道未测试的内容时,为存储过程编写自动化测试会容易得多。 代码覆盖率使您可以查看尚未执行代码的哪些部分。 Piggly是一...
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
5. 可扩展性:PGSQL 允许用户通过编写自定义函数、存储过程和模块来扩展其功能。这使得PGSQL 能够适应各种业务需求,甚至可以实现与其他系统的集成。 6. 高可用性和容错性:PGSQL 支持主备复制、多节点集群和故障...
在这个实验中,我们将深入理解如何使用PL/SQL编写存储过程来访问和操作数据库。 首先,存储过程是预编译的SQL语句集合,可以在需要时多次调用,提高了代码的重用性和效率。在实验中,我们有两个主要的目标:统计...
本篇文章将详细探讨如何在pgsql环境中利用MyBatis来生成实体类,从而简化开发过程。 首先,了解MyBatis的基本概念是必要的。MyBatis是一个SQL映射框架,它的核心功能在于将数据库操作与业务逻辑分离,通过XML或注解...
在IT行业中,数据库设计是开发过程中至关重要的一环。它涉及到数据结构、关系模型以及业务逻辑的规划,确保数据的有效存储和高效访问。`MySQL`和`PostgreSQL`(pgsql)是两种广泛使用的开源关系型数据库管理系统,它们...
**osm2pgsql详解** osm2pgsql是一个用于将OpenStreetMap(OSM)数据导入到PostgreSQL数据库的工具,它是OSM数据处理...在使用过程中,理解其数据模型、配置选项以及性能优化方法,对于高效管理和利用OSM数据至关重要。
标题“osm2pgsql.rar”指的是一个用于在Windows操作系统中将OpenStreetMap(OSM)数据导入PostgreSQL数据库的工具包。osm2pgsql是这个工具的名称,它是一个开源软件,广泛应用于地理信息系统(GIS)领域。这个压缩包...
* 语言:指定存储过程的语言,例如PL/pgSQL 例如: ``` CREATE OR REPLACE FUNCTION过程名(参数名 参数类型,…..) RETURNS 返回值类型 AS $BODY$ DECLARE 变量名 变量类型; BEGIN -- 函数体 END; $BODY$ LANGUAGE ...
它支持各种PgSql特有的特性,如JSONB、数组、hstore等复杂数据类型,以及触发器、存储过程等数据库对象。Npgsql通过ADO.NET接口与数据库交互,这意味着你可以利用.NET Framework中的SqlCommand、SqlDataReader等类来...
在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...
在PostgreSQL中,存储过程由SQL语句和其他PL/pgSQL语言元素组成。 PL/pgSQL是PostgreSQL内置的一种过程语言,专门为PostgreSQL设计,其语法类似Oracle的PL/SQL。PL/pgSQL提供了流程控制结构(如循环、条件判断),...
"SQL存储过程生成器源码"是一个实用工具,能够自动化创建数据库的增、删、改、查(CRUD)操作的存储过程,极大地提高了开发效率。 首先,我们来理解一下存储过程的基本概念。存储过程可以包含多种SQL语句,如SELECT...
它支持复杂的数据类型、ACID事务、存储过程和触发器,是许多大型企业和高流量网站的首选数据库。 #### 14. PostgreSQL可以处理最近各个国家夏时制的变化吗? PostgreSQL内置了时区支持,可以自动调整由于夏时制变化...
【pgsql9.6 绿色版】是一款无需安装...总之,pgsql9.6绿色版为用户提供了一种便捷的方式来部署和使用PostgreSQL数据库,无需经历完整的安装过程。通过熟悉和掌握其基本操作,你可以轻松管理数据库,满足各种项目需求。