- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在pl/pgsql
中,我想创建函数/过程来返回表和totalRecord的结果列表(返回记录),所以我创建了这个函数:
CREATE OR REPLACE FUNCTION GET_LIST_NOTIFY(
-- Cursor param
out PO_Cursor refcursor, -- return Resutlset
out PO_ErrorCode VARCHAR,
out PO_ErrorDesc VARCHAR,
OUT PO_TotalRow VARCHAR
)
as
$$
declare
-- Variable Declare
vSqlSel VARCHAR(20000); -- Sql select
-- END Variable Declare
begin
PO_ErrorCode := 'CODE';
PO_ErrorDesc := 'MSG_DESC';
vSqlSel := 'SELECT ID, TITLE ' ||
' FROM USER_NOTIFICATION ';
raise info 'sql select : %', vSqlSel;
-- open cursor
OPEN PO_Cursor for execute vSqlSel;
EXECUTE 'SELECT count(*) FROM USER_NOTIFICATION' INTO PO_TotalRow;
EXCEPTION
WHEN OTHERS THEN
PO_ErrorCode := 'COMMONERROR_CODE';
PO_ErrorDesc := substr(SQLERRM,1,200);
RAISE;
END;
$$ LANGUAGE plpgsql;
-- END GET_LIST_NOTIFY
但是当我调用这个函数时,返回的结果是:
- refcursor is "<unnamed portal 1>"
- PO_ErrorCode is "CODE"
- PO_ErrorDesc is "MSG_DESC"
- PO_TotalRow is "10"
因此,我无法使用 refcursor 来检索并显示 java
中的记录数据。我该如何解决这个问题?
在oracle pl/sql中我可以这样写:
PROCEDURE GET_LIST_NOTIFY(
-- Fields param
PI_USERNAME IN VARCHAR2,
-- END Fields param
-- Cursor param
PO_Cursor OUT REF CURSOR,
PO_TotalRow OUT VARCHAR2,
PO_ErrorCode OUT VARCHAR2,
PO_ErrorDesc OUT VARCHAR2
)
AS
-- Variable Declare
vSqlSel VARCHAR2(20000); -- Sql select
-- END Variable Declare
BEGIN
PO_ErrorCode := 'SUCCESS_CODE';
PO_ErrorDesc := 'SUCCESS_MSG';
vSqlSel := 'SELECT ID, TITLE ' ||
' FROM USER_NOTIFICATION ';
dbms_output.put_line('sql select :' || vSqlSel);
EXECUTE IMMEDIATE 'SELECT count(*) FROM USER_NOTIFICATION' INTO PO_TotalRow;
-- open cursor
OPEN PO_Cursor FOR
vSqlSel;
EXCEPTION
WHEN OTHERS THEN
IF PO_Cursor%ISOPEN THEN
CLOSE PO_Cursor;
END IF;
PO_ErrorCode := 'COMMONERROR_CODE';
PO_ErrorDesc := substr(DBMS_UTILITY.format_error_backtrace || ' ' ||
SQLERRM,1,200);
RAISE;
END;
-- END GET_LIST_NOTIFY
在我的java代码中,我这样调用“get_list_notify”函数:
RowMapper rowMapper = new RowMapper() {
@Override
public Object mapRow(ResultSet rs, int rownum) throws SQLException {
// TODO Auto-generated method stub
OptionDTO dto = new OptionDTO();
try {
dto.setValue(Utils.validateHTMLParam(rs.getString(1).trim(), false));
dto.setText(Utils.validateHTMLParam(rs.getString(2).trim(), false));
} catch (Exception e) {
ErrorHelper.PrintStackTrace(this.getClass().getName(), e, "DataProcessing.getDrowdownData2.OptionMapper.mapRow error : ");
}
return dto;
}
};
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(DBConnector.getConnection())
.withFunctionName(procedureName).withoutProcedureColumnMetaDataAccess();
Map<String, Object> params = new LinkedHashMap();
for (String key : parameters.keySet()) {
simpleJdbcCall.addDeclaredParameter(new SqlParameter(key, parameters.get(key).getType()));
if(Utils.isNummericOracleType(parameters.get(key).getType()) && parameters.get(key).getData() != null)
params.put(key, new BigDecimal(parameters.get(key).getData().toString()));
else
params.put(key, parameters.get(key).getData());
}
simpleJdbcCall.addDeclaredParameter(new SqlOutParameter("PO_Cursor", Oid.REF_CURSOR, rowMapper));
simpleJdbcCall.addDeclaredParameter(new SqlOutParameter("PO_ErrorCode", Oid.VARCHAR));
simpleJdbcCall.addDeclaredParameter(new SqlOutParameter("PO_ErrorDesc", Oid.VARCHAR));
Map<String, Object> map = simpleJdbcCall.execute(params);
但是在执行时,simpleJdbcCall.execute(params)引发异常,如下所示:
[err] -----org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{? = call get_list_notify(?, ?, ?)}]; SQL state [34000]; error code [0]; ERROR: cursor "<unnamed portal 1>" does not exist; nested exception is org.postgresql.util.PSQLException: ERROR: cursor "<unnamed portal 1>" does not exist
[err] --------------- At classes : ---------------
[err] ----- at com.bidv.bidvwas.common.DataProccessing.getDrowdownData(DataProccessing.java:399)
如何准确转换 pl/pgsql 并解析来自 java 的调用函数。我使用 springjdbc-4.2.5 和 postgres 10.4
最佳答案
你的代码有点奇怪(太奇怪了 - 几乎有我知道的所有反模式:) - 在一个例子中)。您尝试连接应该分开的事物,并且尝试错误地使用存储过程。通常,过程不应提供 View (并非在所有没有 MSSQL 的数据库中)。通过过程,您的代码应该更具可读性,而不是更少。
您错过了命令FETCH
。您应该将其用于 <unnamed portal>
.
CREATE OR REPLACE FUNCTION public.fx(par text, INOUT r refcursor, OUT result integer)
RETURNS record
LANGUAGE plpgsql
AS $function$
BEGIN
result := 10;
OPEN r FOR SELECT * FROM pg_class WHERE relname LIKE par;
END;
$function$
postgres=# SELECT fx('pg_c%', 'my_name_for_cursor');┌─────────────────────────┐│ fx │╞═════════════════════════╡│ (my_name_for_cursor,10) │└─────────────────────────┘(1 row)postgres=# FETCH 10 FROM my_name_for_cursor;┌───────────────────────────────────┬──────────────┬─────────┬───────────┬──────────┬───────┬─────────────┬─────────────│ relname │ relnamespace │ reltype │ reloftype │ relowner │ relam │ relfilenode │ reltablespac╞═══════════════════════════════════╪══════════════╪═════════╪═══════════╪══════════╪═══════╪═════════════╪═════════════│ pg_cast_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2660 │ │ pg_cast_source_target_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2661 │ │ pg_class_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ │ pg_class_relname_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ │ pg_class_tblspc_relfilenode_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ │ pg_collation_name_enc_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3164 │ │ pg_collation_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3085 │ │ pg_constraint_conname_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2664 │ │ pg_constraint_conrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2665 │ │ pg_constraint_contypid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2666 │ └───────────────────────────────────┴──────────────┴─────────┴───────────┴──────────┴───────┴─────────────┴─────────────(10 rows)postgres=# COMMIT;
更多 - 您使用动态 SQL 太多(命令 EXECUTE
)。较新的版本在不需要时使用动态 SQL。在您的示例中,永远不应该使用动态 SQL。
捕获所有错误通常也是个坏主意。这是客户端的工作,而不是存储过程中的代码。仅处理您可以正确解决的错误。有关异常的所有信息也可以在客户端获取,并且您不需要编写这些晦涩的包装器。
关于java - 如何在 pl/pgsql 中创建返回 refcursor 和totalRow 的函数/过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51508823/
我正在使用源代码中的Postgres 13(Rel_13_STRATE分支),并且我使用的是来自apachea/age源代码的(Release/PG13/1.3.0分支)中的1.3.0版的Apache
我有 fusionpbx 和简单的 pgsql 工作......现在我已经用 bdr pgsql 创建了 HA fusionpbx 并且它工作正常但我不知道如何将数据从非 bdr pgsql 迁移到
我正在尝试安装 php7.0-pgsql,但总是得到 E: 无法定位软件包 phpXXX-pgsql 我在尝试 apt-get update apt-get install php7.0-pgsq
我有一个 Rails 应用程序,我正在尝试对其运行测试。在我能够成功运行 rake test:all 的前一天,一切都井井有条。今天,当我运行 rake test:all 时,我收到了这个错误: 我知
有时候我们项目中会遇到查询的字符串比较特殊:如自己本身待单引号 此时查询肯定报错。那么处理方式也很简单 只需要这样加一个单引号 这样就可以解决了 解决方式和MySQL方式不一样。 补充
1、网上一般说的方法如下: :=,赋值,比如user_id := 20; select into 赋值,比如 ?
我就废话不多说了,看代码吧~ ? 1
删除数据库的命令: ? 1
方法: pg10.0之前: select pg_switch_xlog(); pg10.0之后: select pg_switch_wal(); 备注:执行 pg_switch_xlog(
1. 获取表中普通信息:如字段名,字段类型等 ? 1
环境:VMware、CentOS-7-x86_64-DVD-2009.iso、nginx-1.26.1、php-7.2.0、postgresql-12 php最好安装对应php项目所需版本,否则会出
我正在尝试将字符串列数据排序为数字。我收到如下错误: ERROR: invalid input syntax for integer: "HEI001" SQL state: 22P02 我尝试过:
如果我将这两个 Postgres 函数定义保存在两个单独的 .sql 文件中: CREATE OR REPLACE FUNCTION column_exists(tablename text, col
我正在尝试在 Windows 10 64 位 (WAPP) 上使用 pgsql 扩展。 我有: 重新启动 Apache 取消注释 php.ini 中的所有 postgresql 扩展 使用LoadFi
我尝试使用 phpPgAdmin 在我的数据库中创建一个表。但是在生成代码后出现错误。 SQL 错误: ERROR: syntax error at or near "(" at character
我已经在 pgsql 中创建了一个存储过程。特定列中有一个 json 对象,我需要获取该 json 对象中数据的总和。在遇到空值之前,它可以完美运行。json 对象中的元素可以有空值。但是当我得到总和
我必须编写一个查询,以某种方式对我的用户名进行排序(排序),其中应优先使用特定字母(在名称中)进行排序。例如,如果我有用户 Lemon、Loger、Alan、Avon、Bland、Cavin、Clau
背景 我是 PostgreSQL 的新手,我在使用这个触发函数时遇到了一些问题,我在下面明显简化了这些问题。我可以要求帮助修复查询,但我认为我可以处理,而且我更关心的是我有很多这样的功能,我需要一种方
我正在尝试确定如何在 PgSQL 中将一年中的某一天转回日期。当我这样做时 select date '2013-01-01' + interval '53 days' 我得到一个时间戳: "2013-
这段代码没有错误,但没有任何数据变化,请帮助我。我想从一些库存表中多次更新数量 drop FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varc
我是一名优秀的程序员,十分优秀!