`
flash7783
  • 浏览: 309574 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

pgsql存储过程介绍

阅读更多
   虽然现在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数据库步骤及注意.docx

    本文档将详细介绍PgSQL 到 MySQL 数据库迁移的步骤和注意事项。 Step 1: 使用 DBConvert 工具将 PgSQL 数据库中的表结构和数据转至 MySQL 数据库中 在使用 DBConvert 工具时,需要填写必要的信息,然后点击 next,...

    tsql2pgsql:帮助那些将存储过程从 TSQL (SQL Server) 转换为 PLPGSQL (Postgresql) 的工具

    tsql2pgsql是一款非常实用的工具,主要用于帮助数据库管理员和开发者将TSQL(SQL Server的存储过程语言)转换为PL/PGSQL(PostgreSQL的存储过程语言)。在SQL Server和PostgreSQL之间进行迁移时,这个工具能显著减轻...

    计算两经纬度之间的距离存储过程_mysql

    本文将详细介绍如何在MySQL中创建一个存储过程来实现这一功能。 #### 核心概念解析 1. **经纬度**:用于表示地球表面某一位置的坐标。纬度范围是-90°到90°,经度范围是-180°到180°。 2. **存储过程**:MySQL中...

    postgreSQL的CURD和存储过程

    本文将深入探讨PostgreSQL中的CURD操作以及存储过程,并结合jdbc、hibernate、ibatis三种不同的Java数据访问技术进行讲解。 **一、CURD操作** 1. **创建(Create)**:在PostgreSQL中,创建表是最基本的操作。例如,...

    piggly:PLpgSQL存储过程代码覆盖工具

    PostgreSQL PL / pgSQL存储过程代码覆盖率 目的 PL / pgSQL并没有太多的开发人员工具,当您知道未测试的内容时,为存储过程编写自动化测试会容易得多。 代码覆盖率使您可以查看尚未执行代码的哪些部分。 Piggly是一...

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    解密PGSQL数据库引擎

    5. 可扩展性:PGSQL 允许用户通过编写自定义函数、存储过程和模块来扩展其功能。这使得PGSQL 能够适应各种业务需求,甚至可以实现与其他系统的集成。 6. 高可用性和容错性:PGSQL 支持主备复制、多节点集群和故障...

    使用PLSQL编写存储过程访问数据库.doc

    在这个实验中,我们将深入理解如何使用PL/SQL编写存储过程来访问和操作数据库。 首先,存储过程是预编译的SQL语句集合,可以在需要时多次调用,提高了代码的重用性和效率。在实验中,我们有两个主要的目标:统计...

    pgsql中使用mybatis生成实体类

    本篇文章将详细探讨如何在pgsql环境中利用MyBatis来生成实体类,从而简化开发过程。 首先,了解MyBatis的基本概念是必要的。MyBatis是一个SQL映射框架,它的核心功能在于将数据库操作与业务逻辑分离,通过XML或注解...

    mysql、pgsql自动生成数据库设计文档

    在IT行业中,数据库设计是开发过程中至关重要的一环。它涉及到数据结构、关系模型以及业务逻辑的规划,确保数据的有效存储和高效访问。`MySQL`和`PostgreSQL`(pgsql)是两种广泛使用的开源关系型数据库管理系统,它们...

    osm2pgsql(OSM数据导入到Postgres中工具)

    **osm2pgsql详解** osm2pgsql是一个用于将OpenStreetMap(OSM)数据导入到PostgreSQL数据库的工具,它是OSM数据处理...在使用过程中,理解其数据模型、配置选项以及性能优化方法,对于高效管理和利用OSM数据至关重要。

    osm2pgsql.rar

    标题“osm2pgsql.rar”指的是一个用于在Windows操作系统中将OpenStreetMap(OSM)数据导入PostgreSQL数据库的工具包。osm2pgsql是这个工具的名称,它是一个开源软件,广泛应用于地理信息系统(GIS)领域。这个压缩包...

    Postgresql存储过程

    * 语言:指定存储过程的语言,例如PL/pgSQL 例如: ``` CREATE OR REPLACE FUNCTION过程名(参数名 参数类型,…..) RETURNS 返回值类型 AS $BODY$ DECLARE 变量名 变量类型; BEGIN -- 函数体 END; $BODY$ LANGUAGE ...

    C# asp.net PgSql驱动 Npgsql mono.security

    它支持各种PgSql特有的特性,如JSONB、数组、hstore等复杂数据类型,以及触发器、存储过程等数据库对象。Npgsql通过ADO.NET接口与数据库交互,这意味着你可以利用.NET Framework中的SqlCommand、SqlDataReader等类来...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...

    postgresql存储过程

    在PostgreSQL中,存储过程由SQL语句和其他PL/pgSQL语言元素组成。 PL/pgSQL是PostgreSQL内置的一种过程语言,专门为PostgreSQL设计,其语法类似Oracle的PL/SQL。PL/pgSQL提供了流程控制结构(如循环、条件判断),...

    SQL存储过程生成器源码

    "SQL存储过程生成器源码"是一个实用工具,能够自动化创建数据库的增、删、改、查(CRUD)操作的存储过程,极大地提高了开发效率。 首先,我们来理解一下存储过程的基本概念。存储过程可以包含多种SQL语句,如SELECT...

    PGSQL常见的问题

    它支持复杂的数据类型、ACID事务、存储过程和触发器,是许多大型企业和高流量网站的首选数据库。 #### 14. PostgreSQL可以处理最近各个国家夏时制的变化吗? PostgreSQL内置了时区支持,可以自动调整由于夏时制变化...

    pgsql9.6 绿色版

    【pgsql9.6 绿色版】是一款无需安装...总之,pgsql9.6绿色版为用户提供了一种便捷的方式来部署和使用PostgreSQL数据库,无需经历完整的安装过程。通过熟悉和掌握其基本操作,你可以轻松管理数据库,满足各种项目需求。

Global site tag (gtag.js) - Google Analytics