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` 列。结果集将作为代码块的返回值返回。