(1)使用 return query 创建function

CREATE OR REPLACE FUNCTION get_one_record()
 RETURNS SETOF RECORD as
DECLARE
    v_rec RECORD;
BEGIN
   return query ( SELECT * FROM public.config );
   return;
LANGUAGE PLPGSQL;

查询结果:

postgres=# SELECT * FROM get_one_record() t(code varchar,name VARCHAR);
 code |      name
------+----------------
 200  | 连接成功
 404  | 未找到服务器
 500  | 服务器内部错误
 401  | 未授权
 503  | 服务器不可用
(5 rows)

(2)使用游标方式

CREATE OR REPLACE FUNCTION public.get_one_refcursor(refcursor)
RETURNS refcursor AS $body$
BEGIN
OPEN $1 for SELECT * FROM public.config;
RETURN $1;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

查询结果:

postgres=# begin;
BEGIN
kf8193=# select * from get_one_refcursor('aa');
 get_one_refcursor
-------------------
(1 row)
postgres=# fetch all in "aa";
 code |      name
------+----------------
 200  | 连接成功
 404  | 未找到服务器
 500  | 服务器内部错误
 401  | 未授权
 503  | 服务器不可用
(5 rows)
postgres=# commit;
COMMIT

多个结果集

多个结果集只能使用游标方式进行返回

-- 方式1:
CREATE OR REPLACE FUNCTION public.get_more_refcursor(refcursor,refcursor)
RETURNS SETOF refcursor AS $body$
BEGIN
OPEN $1 for SELECT * FROM public.config limit 5;
RETURN NEXT $1;
OPEN $2 for SELECT * FROM public.flink;
RETURN NEXT $2;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
-- 方式2:
CREATE OR REPLACE FUNCTION public.get_more_refcursor2(INOUT refcursor,INOUT refcursor)
RETURNS record AS $body$
BEGIN
OPEN $1 for SELECT * FROM public.config limit 5;
OPEN $2 for SELECT * FROM public.flink;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

查询结果:

postgres=# select * from get_more_refcursor('a','b');
 get_more_refcursor
--------------------
(2 rows)
postgres=# fetch all from a;
 code |      name
------+----------------
 200  | 连接成功
 404  | 未找到服务器
 500  | 服务器内部错误
 401  | 未授权
 503  | 服务器不可用
(5 rows)
postgres=# fetch all from b;
 word | count |     update_time
------+-------+---------------------
 aa   |     1 | 2019-05-09 10:56:10
 bb   |     3 | 2019-05-09 10:56:10
 bb   |     3 | 2019-05-09 10:56:15
 aa   |     3 | 2019-05-09 10:56:15
 aa   |     2 | 2019-05-09 10:56:20
(5 rows)
postgres=# commit;
COMMIT

return query的方式比较简便,操作方便,但必须指定返回结果的类型。
cursor 游标的方式返回结果集较为随意,但无法直接得到结果。需要在一个事务中进行查询。但可以一次查询返回多个结果集。

JAVA查询结果集

package dynamicSQL;
import java.sql.*;
import static modelEntertainment.BasicPeopleInfo.basicConnection;
import static modelEntertainment.BasicPeopleInfo.close;
 * @author 
 * @description 解析动态结果数据集
 * @date 2019/7/11
public class Test {
    public static void main(String[] args) {
        final String url = "jdbc:postgresql://192.168.***.***:5432/test";
        final String user = "postgres";
        final String password = "passwd";
        final String sql = "{ call get_one_refcursor(?::refcursor) }";
        final String sql2 = "{ call get_more_refcursor2(?::refcursor, ?::refcursor) }";
        Connection connection = basicConnection(url, user, password);
        // 单个结果集
//        try {
//            connection.setAutoCommit(false);
//            CallableStatement st = connection.prepareCall(sql);
//            st.setObject(1, "results");
//            st.registerOutParameter(1, Types.REF_CURSOR);
//            st.execute();
//            ResultSet rs = (ResultSet) st.getObject(1);
//            ArrayList<ArrayList<JSONObject>> arrayList = new ArrayList<>();
//            while (rs.next()) {
//                ResultSetMetaData metaData = rs.getMetaData();
				  // 数据集的列数
//                int columnCount = metaData.getColumnCount();
//                ArrayList<JSONObject> arrayList1 = new ArrayList<>();
//                for (int i = 1; i <= columnCount; i++) {
//                    JSONObject jsonObject = new JSONObject();
					  // 数据集的列名
//                    String columnName = metaData.getColumnName(i);
//                    Object object = rs.getObject(i);
//                    jsonObject.put(columnName,object);
//                    arrayList1.add(jsonObject);
//                }
//                arrayList.add(arrayList1);
//            }
//            System.out.println(arrayList);
//            connection.commit();
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//        close();
		// 多个结果集
        try {
            connection.setAutoCommit(false);
            CallableStatement callableStatement = connection.prepareCall(sql2);
            callableStatement.setObject(1,"aa");
            callableStatement.setObject(2,"bb");
            callableStatement.registerOutParameter(1, Types.REF_CURSOR);
            callableStatement.registerOutParameter(2, Types.REF_CURSOR);
            callableStatement.execute();
            ResultSet object1 = (ResultSet)callableStatement.getObject(1);
            ResultSet object2 = (ResultSet)callableStatement.getObject(2);
            while (object1.next()) {
                ResultSetMetaData metaData = object1.getMetaData();
                int columnCount = metaData.getColumnCount();
                for (int i = 1; i <= columnCount; i++) {
                    Object object = object1.getObject(i);
                    System.out.println(object);
            while (object2.next()) {
                ResultSetMetaData metaData = object2.getMetaData();
                int columnCount = metaData.getColumnCount();
                for (int i = 1; i <= columnCount; i++) {
                    Object object = object2.getObject(i);
                    System.out.println(object);
        } catch (SQLException e) {
            e.printStackTrace();
        close();

注意:java查询多个结果集时,必须使用方式二创建function,方式一创建的function会报一下错误:
org.postgresql.util.PSQLException: A CallableStatement was executed with an invalid number of parameters

单个结果集(1)使用 return query 创建functionCREATE OR REPLACE FUNCTION get_one_record() RETURNS SETOF RECORD as$$DECLARE v_rec RECORD;BEGIN return query ( SELECT * FROM public.config ); retu...
1.插入数据(INSERT语句) 在PostgreSQL中,INSERT 查询用于在表中插入新行。可以一次插入单行或多行到表中。语法:注意:column1,column2,column3,...columnN是要插入数据的表中的列的名称。 在PostgreSQL中,SELECT语句用于从数据库表中检索数据。数据以结果表格的形式返回。这些结果表称为结果集
我们想把一个查询语句返回的结果集插入到多个目标表中。例如,希望把A表的数据分别插入到 B 表、C 表和 D 表。这3个表与 A 表的结构相同(相同的列和数据类型),并且当前不含任何数据。 解决办法就是把查询结果插入到多个目标表中。在oracle中我们可以使用insert all或者insert first语句,两者语法基本一致,区别在于: insert first:对于每一行数据,只插入到第一个when条件成立的表,不继续检查其他条件。 insert all :对于每一行数据,对每一个when条件都进行检查,如果满足条件就执行插入操作。 但是在pg中是不支持该语法的,那么我们该如何实现多表插入
PostgreSQLCursor用于处理大型结果集 PostgreSQLCursor扩展了ActiveRecord以允许高效处理返回大量行的查询,并允许您对结果集进行排序。 在PostgreSQL中,运行一个查询,您将从中查询一个(例如1000个)行的块,进行处理,然后继续获取直到结果集用完。 通过获取较小的数据块,这减少了应用程序使用的内存量,并防止了内存用尽的潜在崩溃。 支持更高版本的Rails / ActiveRecord v3.1(建议使用v3.2)(包括v5.0)以及Ruby 1.9和更高版本。 并非所有功能都可以在ActiveRecord v3.1中使用。 仅在正式支持的ActiveRecord和Ruby版本中才支持此gem; 其他人可以尝试旧版的gem。 PostgreSQLCursor的开发是为了利用PostgreSQL游标。 游标允许程序声明游标以运行给定的查询,以将行的“块”返回给应用程序,同时保留完整结果集在数据库中的位置。 这克服了使用find_each和find_in_batches的所有缺点。 同样,对于PostgreSQL,您可以选择返回
PostgreSQL多维数据集 一个向添加[ cube ](TODO,postgresql cube docs)支持的库 使用此库,可以将Cube[[1, 2, 3], [4, 5, 6]]类的内容编写为查询模板的一部分。 它不提供解析能力Cube从返回SQL S,主要是因为它看起来很难,我并不需要它为我的使用情况。 我可能会在某个时候解决它,但是与此同时欢迎补丁程序。 就像使用任何其他查询参数一样,只需使用Cube数据集即可。 execute " INSERT INTO table(cube_field, name) VALUES(?, ?) RETURNING id " ( Cube [[ 1 , 2 , 3 ]], " Testing " ) executeMany " INSERT INTO table(cube_field, name) VALUES(?, ?) RETU
Mybatis中发生Parameter xx not found. Available parameters are [arg1, arg0, param1, param] 错误可能的情况
实体类属性定义为Integer,但数据库该字段类型为varchar 3 触发机制 本人所遇到的情况为:如果该数据库该字段为null时,进行查询操作会触发该报错.如果数据库该字段刚好有数字字符,则不会触发 4 解决方案 将该字段属性改为String即可解决问题
简介:JDBC中的语句处理 在JDBC应用程序中,JDBC语句对象用于将SQL语句发送到数据库服务器。 语句对象与连接相关联,它是处理应用程序与数据库服务器之间通信的语句对象。 JDBC提供三种类型的语句对象: 一般性发言 准备好的声明 可赎回声明 语句对象与连接关联,因此您应该建立数据库连接以创建语句对象。 下面清单1中的代码示例说明了如何创建连...
PostgreSQL 块语句(也称为匿名代码块)可以使用 `RETURN` 语句返回结果。在块语句内部,你可以使用 PL/pgSQL 语言来编写逻辑。 以下是一个示例,演示如何在块语句内部使用 `RETURN` 语句返回结果: ```SQL DO $$ DECLARE result INTEGER := 0; BEGIN result := 1 + 2; RETURN result; $$ LANGUAGE plpgsql; 在上面的代码中,我们定义了一个匿名代码块,其中声明了一个名为 `result` 的整数变量。在代码块的主体内部,我们将 `result` 的值设置为 1 加上 2,然后使用 `RETURN` 语句返回 `result` 的值。 要执行该代码块并返回结果,可以使用 `SELECT` 语句来调用它: ```SQL SELECT * FROM (DO $$ ... $$ LANGUAGE plpgsql) subquery; 这将返回一个包含一个名为 `?column?` 的列的数据集,其中包含了我们在代码块中返回的结果。 如果你想要在代码块中返回更复杂的数据结构,例如表格或记录,可以使用 `RETURN QUERY` 语句返回查询结果集。例如: ```SQL DO $$ BEGIN RETURN QUERY SELECT id, name FROM users; $$ LANGUAGE plpgsql; 在上面的代码块中,我们使用 `RETURN QUERY` 语句返回了一个查询结果集,该结果集包含了 `users` 表格中的 `id` 和 `name` 列。结果集将作为代码块的返回返回
panda_225400: -ERROR: could not access file "gptext-gpdb6-3.7.0": No such file or directory (seg2 192.168.1.205:33000 pid=88205) 【ElasticSearch 进阶】倒排索引 + FOR + RBM压缩算法 EmotionFlying: 支持博主,一起加油表情包