暂无图片
postgressql begin end 区块检查
我来答
分享
小傑
2022-06-10
postgressql begin end 区块检查
postgreSQL 13

发现procedure/function 有使用 begin end 的形式包起来的话,里面的table 就不会检查是否真的有此table

--NG   ERROR: relation "tbl" does not exist
CREATE or replace PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;

--OK
CREATE or replace PROCEDURE insert_data(a integer, b integer)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
END;$$

check_function_bodies 预设为on,但是碰到 begin end 就不会检查

这是为什么呢?

begin end 的区块也能从DB参数上设定为检查物件是否存在,如果物件都有存在,再建立function/procedure吗?
谢谢
复制
我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
彭冲

这个问题的本质是language:sql vs plpgsql的区别。language sql是DML查询语言,language plpgsql是过程性语言,使用begin end块,需要捕获错误,结构如下:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;
复制

个人理解sql是编译时检查, plsql是运行时检查。

暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
小傑
补充 tbl不存在也会建立function
--OK CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ BEGIN INSERT INTO tbl VALUES (a); END; $$ LANGUAGE plpgsql;
复制
暂无图片 评论
暂无图片 有用 0
打赏 0
DarkAthena

有人告诉我,因为可以这样
image.png
虽然代码灵活性增强了,不过我感觉我是被oracle惯坏了,先编译,看到报错再补对象脚本,而这样的操作将不再适用于pg,所以在pg里面的代码编写必须更加认真仔细

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
PCP和PGCE这两个证哪个含金量更高一些更值得考?
回答 2
这是两个认证体系,还是建议自行考虑
pg如何查看wal文件的物理路径?
回答 2
参数logdirectory决定了pgwal日志存放的目录名字,默认为log;不过这个是相对目录,相对于$PGDATA,$PGDATA目录可以查看参数datadirectory
openGauss 与 postgresql在关键技术有什么区别?
回答 1
可参考,欢迎补充:
询问权限
回答 1
在PostgreSQL中,要授予用户对特定表的查询权限,语法如下:GRANTSELECT(columnname)ONtablenameTOusername;因此,正确的语句是:B.grantselec
有使用 postgres_fdw 插件吗? 不知道效率怎么样。
回答 1
postgresfdw为访问远程表提供了更透明和符合标准的语法,并且在许多情况下可以提供更好的性能。postgresfdw是PG源码包自带的插件,所以直接去源码包进行编译安装即可,这里需要注意的是,在
请问各位老大postgresql如何给用户授予创建schema的权限?
回答 2
已采纳
postgres&gt;createschemaecuac;ERROR:permissiondeniedfordatabasepostgres这个错误表明你正在尝试在postgres数据库上创建sch
postgreSQL 的两地三中心,采用什么架构及部署方式?
回答 1
repmgr
物理复制的启动和停止顺序?
回答 1
在PostgreSQL物理流复制架构中(例如一主一从),进行系统级维护时,通常推荐的停启顺序如下:停止(关库)顺序:先停止从库(Standby):先关闭从库可确保从库不会在主库关闭后反复尝试连接,从而
pg_basebackup搭建从库报错
回答 3
最后在data/global目录下删除了pginternalbak.init文件,pgbasebackup命令执行成功
在postgresql 表中建了一个check约束使用了like判断: check (name like '[0-9]'); 结果insert into 表名 values('0'); 执行报错:违反了检醒约束
回答 1
已采纳
可以使用similarto方法替换like(postgres@[local])[sbtest]14:01:15createtabletlike(idint,namevarchar(20)check(n