`
manjingtou
  • 浏览: 119235 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

postgre存储过程简单实用方法 (过程语言: PL/pgSQL)

阅读更多

postgre存储过程简单实用方法 (过程语言: PL/pgSQL)

一,介绍常用的PL/pgSQL结构和语法:
1,结构
PL/pgSQL是一种块结构的语言,比较方便的是用pgAdmin III新建Function,填入一些参数就可以了。基本上是这样的:
CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4, 整型数组 _int4, …])
RETURNS 返回值类型 AS
$BODY$
DECLARE
变量声明
BEGIN
函数体
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;

2,变量类型 除了postgresql内置的变量类型外,常用的还有 RECORD ,表示一条记录。
赋值 :“变量 := 表达式;”
连接字符串的是“||”,比如 sql := ‘SELECT * FROM’ || table || ‘WHERE …’;
3,判断
IF 条件 THEN

ELSEIF 条件 THEN

ELSE

END IF;
4,循环 循环有好几种写法:
WHILE expression LOOP
statements
END LOOP;
还有常用的一种是:(从1循环到9可以写成FOR i IN 1..9 LOOP)
FOR name IN [ REVERSE ] expression .. expression LOOP
statements
END LOOP;

二 跟mysql对比较


1,postgre 中的limit不支持LIMIT #,# 这样的语法。

而是支持 LIMIT and OFFSET clauses 语法

mysql上面的两种方式都支持。
2,存储过程中在ibatis中的使用:

(1),mysql存储过程可以直接返回结果集,同时可以有out参数
例如:
存储过程:
CREATE  PROCEDURE `test`
(IN _login VARCHAR(32),
IN _psw VARCHAR(32),
OUT _ret INTEGER(10),
 OUT _id INTEGER(10),
OUT _name VARCHAR(32),
OUT _email VARCHAR(32),
OUT _phone VARCHAR(20),
OUT _active INTEGER(11))//同时返回多个结果集合

BEGIN
    DECLARE CONTINUE HANDLER FOR NOT FOUND set _ret =-1;
    set _ret = 0 ;

    select id,name,email,phone,active
    into _id,_name,_email,_phone,_active
    from test
    where tx_account.`loginname`=_login and tx_account.`password`=MD5(_psw) and active=1;
    ---------返回结果集-----
    if _ret = 0 then
       select a.id as id ,a.name as name,a.priority as priority
       from test b left join test1 a on b.role=a.id
       where b.account=_id;
    end if;
END;
直接返回结果集
ibatis文件
  <parameterMap id="testParameterMap" class="params">
    <parameter property="loginname" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    <parameter property="ret" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
    <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>   
    <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="phone" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="email" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="active" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
  </parameterMap>
 
  <procedure id="test" parameterMap="testMap" resultMap="AccountRoleResultMap">
    {call test(?,?,?,?,?,?,?,?)}
  </procedure> 
  
dao 的实现
定义一个传参的map params ,

  HashMap<String,Object> params = new HashMap<String,Object>();
  //把需要的参数放到map中
  params.put("id",account.getId());
  params.put("ret",null);
  params.put("loginname", null);
  params.put("name", null);
  params.put("email", null);
  params.put("phone",null);
  params.put("active", null);
  定义一个list
  List list=null;
   list= (List)(getSqlMapClientTemplate().queryForList("test",params));
  //上面这样操作就可以获得存储过程返回的结果集。 
   Object var;
   var = params.get("ret");//从map 中获得制定的输出参数的值。
在mysql中不需要的ibatis的配置文件中,声明返回的结果集。
(2) postgre的函数返回结果集
在postgre中返回结果集一定要在ibatis中定义输出参数。
  方法1:不能输出参数,使用直接返游标的方法
例如:
函数:
CREATE OR REPLACE FUNCTION test(IN _login VARCHAR(32))//只有输入参数
  RETURNS
  refcursor //制定返回类型为游标。
  AS
$BODY$
declare video_cur refcursor;
BEGIN

       open video_cur for
 select id , title from test;
       return video_cur ;//返回游标
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION test(integer) OWNER TO postgres;
ibatis文件

    <parameterMap id="testParameters" class="java.util.HashMap">
        <parameter property="result" jdbcType="OTHER" javaType="java.sql.ResultSet" mode="OUT"/>//返回结果集
        <parameter property="loginName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="loginPasswd" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    </parameterMap>
   
    <procedure id="test" resultMap="testResultMap" parameterMap="testParameters" >
         {? = call test(?,?)}
    </procedure>
   
上面的map文件描述了3个参数,按照调用方式: ? = call test(?, ?)的顺序,
第一个参数是返回结果集的,这里的jdbcType填写OTHER,javaType填写java.sql.ResultSet,
如果是ORACLE的存储过程通过游标返回结果集的话,jdbcType应该填写为ORACLECURSOR,
不过在PostgreSQL中不能用ORACLECURSOR,得用OTHER。

dao的实现:
定义map文件 parameters ;
 List list;
        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put("loginName", loginName);
        parameters.put("loginPasswd", loginPasswd);
        list=getSqlMapClientTemplate().queryForList("test", parameters);//这样来得到返回的结果集。
 return list;
方法2: 同时返回多个结果,

函数:
CREATE OR REPLACE FUNCTION test(IN _login VARCHAR(32),
IN _psw VARCHAR(32),
OUT _ret INTEGER,
 OUT _id INTEGER,
OUT _name VARCHAR(32),
OUT _email VARCHAR(32),
OUT _phone VARCHAR(20),
OUT _ref refcursor ---返回一个游标
)
  RETURNS record
  AS
$BODY$
declare video_cur refcursor;
BEGIN
    select id,name,email,phone
    into _id,_name,_email,_phone
    from test
    where tx_account.`loginname`=_login and tx_account.`password`=MD5(_psw) and active=1;

    open _ref  for
    select id , title from test1;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION test(integer) OWNER TO postgres;

如果返回多个结果集,就要使用返回伪类型 record可以在输出参数中指定游标为其中一个out参数
ibatis文件

        out 参数输出游标
 <parameterMap id="ParameterMap" class="map" >  
    <parameter property="login " jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> 
    <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    <parameter property="ret" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
    <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>   
    <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="phone" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="email" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
    <parameter property="ref" jdbcType="OTHER" javaType="java.sql.ResultSet" mode="OUT"/>  //返回结果集    

   </parameterMap>

 <procedure id="test" parameterMap="ParameterMap" resultMap="ResultMap">    
     {call test(?,?,?,?,?,?,?,?)} 
   </procedure>

dao的实现跟方法1 相同    

 

 

分享到:
评论
1 楼 polaris1119 2010-01-08  
请问,用ibatis + postgreSQL,存储过程出入一个String数组或List,该怎么做?谢谢

相关推荐

    postgres_exporter:用于Prometheus的PostgreSQL度量标准导出器

    PostgreSQL服务器导出器 用于PostgreSQL服务器指标的Prometheus导出器。 CI测试的PostgreSQL版本: 9.4 , 9.5 , 9.6 , 10 , 11 , 12 , 13 快速开始 该软件包可用于Docker: # Start an example database ...

    GORM PostgreSQL驱动程序-Golang开发

    GORM PostgreSQL驱动程序GORM PostgreSQL驱动程序用法import(“ gorm.io/driver/postgres”“ gorm.io/gorm”)// https://github.com/lib/pq dsn:=“ user = gorm password = gorm DB .name = gorm port = 9920 ...

    易语言源码 Postgre SQL 连接池

    包括,连接池+查询缓存+不知道真假的储存过程+慢查询记录。使用源码使用了E2EE支持库(模块部分思路借鉴了E2EE)。最后..个人觉得..数据量不大的情况下.mysql比较快...但是.数据量大了.感觉pgsql比较快..(也可能是因为...

    记一次 删除 PostgresSql 数据库 报错:有 N 个其它会话正在使用数据库 的解决方案

    一、数据库搭建 1、yum 指定目录安装 https://blog.csdn.net/llwy1428/article/details/105143053 2、yum 直接安装 ...3、编译安装 ...4、PostgreSql 基本操作 ...二、遇到的问题 在Postgre

    Greenplum Database JDBC Driver:greenplum.jar

    使用jdbc连接greenplum database所需要的依赖jar包。

    Navicat Premium 11.0.10

    Navicat Premium combines the functions of other Navicat members and supports most of the features in MySQL, SQL Server, SQLite, Oracle and PostgreSQL including Stored Procedure, Event, Trigger, ...

    Python库 | test_postgre_pd-0.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:test_postgre_pd-0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Javal连接JDBC

    public class Jdbc2 { public static void main(String[] args){ //加载驱动类 try { Class.forName("org.postgresql.Driver"); //建立连接(连接对象内部其实包含了Socket对象,是一个远程的连接,这是...

    PostgreSQL扩展函数,用于lz4压缩和解压缩。适用于Linux操作系统,支持PG10,PG11,PG12,PG13。

    包含四个自定义函数: lz4:接收bytea类型的数据,返回压缩后的bytea类型数据 un_lz4:接收bytea类型的数据,返回解压后的bytea类型数据 lz4_utf8:接收utf8编码的文本数据,返回解压后的bytea类型数据 ...

    网上图书馆系统

    JSP+Postgre+servlet MVC架构... 网上图书馆系统原代码 是我们老师布置的期末作业,做的很不错的哦,很适合大家学习和参考

    oracle转成postgre时,oracle中函数的处理工具(orafce)

    NULL 博文链接:https://moooneee.iteye.com/blog/442478

    node-pgsql-socket:从PostgreSQL到SocketIO

    NodeJS + PostgreSQL + Socket.io 通常在应用程序与数据库服务器之间使用轮询连接,此方法使用PostgreSQL和PL / Python将新的或修改的数据推送到应用程序,否则通过node.js通过Web套接字。 这是我博客上的教程中的...

    处方药

    POSTGRE_URL=postgresql+psycopg2://usr_prescription:secret@localhost:5432/prescription_db PATIENTS_API_URL=https://url/v1 PATIENTS_API_TOKEN_AUTH="Bearer token" PATIENTS_API_MAX_RETRY=2 PATIENTS_...

    postgreSQL copy

    据库入库方法,用copy方式入库,插入速度很快,使用的是postgre jdbc

    关于PostGreSQL中的存储过程

    关于PostGreSQL中的存储过程 PostGreSQL是一个开源的数据库

    postgresql-13.3-2-windows-x64 windows安装器

    postgresql-13.3-2-windows-x64 windows安装器 postgresql-13.3-2-windows-x64 windows安装器 postgresql-13.3-2-windows-x64 windows安装器 postgresql-13.3-2-windows-x64 windows安装器 postgresql-13.3-2-...

    PostgreSQL:PostgreSQL

    -name "postgresql.conf" ## /var/lib/pgsql/12/data/postgresql.conf ## [root@node01 postgresql]# find / -name "pg_hba.conf" ## /var/lib/pgsql/12/data/pg_hba.conf在postgresql.conf中编辑ip侦听打开postgre

    百万数据批量插入存储过程

    mysql 数据库已存储过程插入一千万条测试数据!利用项目即将上限需要,可以完全系统的测试项目性能!里面又完整的文档和各项说明:打开文档就可以实际操作。

    nacos1.4.0部署包(兼容postgresql和mysql)

    nacos1.4.0部署包,可以直接在windows和linux运行,兼容mysql和postgresql。修改nacos源码请查看本文章:https://blog.csdn.net/zxfmamama/article/details/117293712

Global site tag (gtag.js) - Google Analytics