PostgreSQL 的 pl/pgsql 的 cannot begin/end transactions in PL/pgSQL错误

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
postgres=# select FindCourse('aaaa');
ERROR:  cannot begin/end transactions in PL/pgSQL
HINT:  Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT:  PL/pgSQL function findcourse(character varying) line 21 at SQL statement

出现这种错误的原因是:

看我改后的代码:

复制代码
[postgres@lex pgsql]$ cat ./data/test.sqlCREATE OR REPLACE Function FindCourse
   ( name_in IN varchar )
   RETURNS integer LANGUAGE plpgsql AS $$
DECLARE
    cnumber integer;
    c1 CURSOR
    FOR
       SELECT course_number, instructor
        from course_tbl
        where course_name = name_in
        FOR UPDATE;

BEGIN

BEGIN
open c1;
fetch c1 into cnumber;

IF not found THEN
     cnumber := 9999;
ELSE
     UPDATE course_tbl
        SET instructor = 'SMITH'
        WHERE CURRENT OF c1;
    COMMIT;
END IF;

close c1;

EXCEPTION
WHEN OTHERS THEN
END;
RETURN cnumber;
END;$$;
[postgres@lex pgsql]$ 
复制代码

而我之前的是:

复制代码
[postgres@lex pgsql]$ cat ./data/test.sqlCREATE OR REPLACE Function FindCourse
   ( name_in IN varchar )
   RETURNS integer LANGUAGE plpgsql AS $$
DECLARE
    cnumber integer;
    c1 CURSOR
    FOR
       SELECT course_number, instructor
        from course_tbl
        where course_name = name_in
        FOR UPDATE;

BEGIN

BEGIN
open c1;
fetch c1 into cnumber;

IF not found THEN
     cnumber := 9999;
ELSE
     UPDATE course_tbl
        SET instructor = 'SMITH'
        WHERE CURRENT OF c1;
    COMMIT;
END IF;

close c1;

EXCEPTION
WHEN OTHERS THEN
END;
RETURN cnumber;
END;$$;
[postgres@lex pgsql]$ 
复制代码

这就是差别了。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2013/06/07/3124278.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
Oracle 关系型数据库 Linux
PostgreSQL和Oracle中的一条错误消息分析
PostgreSQL服务端的日志里有时会残留一些这样的消息。意思是说客户端的socket意外终止了。 LOG: could not receive data from client: Connection reset by peer. 或中文的 LOG:无法从客户端获得数据: 出现这样的消息有2个可能的原因 1)客户端进程意外结束了 2)客户端进程没有关闭连接就退出了 其中第2点有时比较隐蔽。
1977 0
|
关系型数据库 MySQL PostgreSQL
ruoyi数据源修改为PostgreSQL分页错误
ruoyi数据源修改为PostgreSQL分页错误
131 0
|
消息中间件 数据采集 监控
ELK搭建(七):搭建PostgreSQL慢查询、错误日志监控平台
PostgreSQL是一款功能非常强大的的关系性数据库,适用于需要执行复杂查询的系统。市面上越来越多的公司开始采用PostgreSQL作为主数据库。 今天我们就来讲解如何搭建一个PostgreSQL的慢日志、错误日志监控平台,实时了解到数据库的日志情况,来帮助我们快速排错及优化。
641 0
ELK搭建(七):搭建PostgreSQL慢查询、错误日志监控平台
|
关系型数据库 PostgreSQL
『PostgreSQL』PGSQL手动创建Sequence序列
📣读完这篇文章里你能收获到 - 在PostgreSQL中对Sequence的管理及使用
549 0
『PostgreSQL』PGSQL手动创建Sequence序列
|
SQL NoSQL 关系型数据库
PostgreSQL 打印详细错误调用栈 - pg_backtrace
PostgreSQL 打印详细错误调用栈 - pg_backtrace
1746 0
|
SQL 弹性计算 NoSQL
PostgreSQL 打印详细错误调用栈 - pg_backtrace
标签 PostgreSQL , pg_backtrace , 错误调用栈 , core 背景 PostgreSQL 使用backtrace,让PG的user process支持self-debugging。 NAME backtrace, backtrace_symbols, backtrace_symbols_fd - support for application
656 0
|
SQL 缓存 Java
修改PostgreSQL字段长度导致cached plan must not change result type错误
修改PostgreSQL字段长度可能导致cached plan must not change result type错误
6108 0
|
关系型数据库 数据库 PostgreSQL
PgSQL · 特性分析 · 浅析PostgreSQL 中的JIT
--- title: PgSQL · 特性分析 · 浅析PostgreSQL 中的JIT author: 卓刀 --- ## 背景 估计很多同学看过之前的月报[PgSQL · 特性分析· JIT 在数据仓库中的应用价值](http://mysql.taobao.org/monthly/2016/11/10/),对JIT(just in time)和LLVM(Low Level Vir
2658 0
Oracle PL/SQL应用迁移 AnalyticDB for PostgreSQL指导
AnalyticDB for PostgreSQL(简称:ADB for PG)对Oracle语法有着较好的兼容,本文介绍如何将Oracle应用迁移到AnalyticDB for PostgreSQL。
2769 0
|
关系型数据库 PHP 数据库
CentOS6.9编译安装postgresql和php的pdo_pgsql,pgsql扩展
这篇笔记记录了在CentOS6.9中源码编译安装postgresql的过程,也记录了源码编译安装php的pdo_pgsql,pgsql扩展的过程,由于mysql存在闭源风险,现在postgresql真是越来越火啊
2061 0