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

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

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏