PostgreSQL与Oracle:PL / pgSQL的“编译时”检查

发布时间:2019-11-06 发布网站:大佬教程
大佬教程收集整理的这篇文章主要介绍了PostgreSQL与Oracle:PL / pgSQL的“编译时”检查大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
执行摘要:PostgreSQL很棒,但由于它推迟了许多PL / pgSQL代码检查直到运行时间,因此我们面临着许多工作中的问题.有没有办法让它在这方面更像甲骨文的PL / SQL?

例如…

尝试在任何Oracle DB中执行此操作:

create function foo return number as
begin
  select a from dual;
  return a;
end;

Oracle将立即(即在编译时!)响应:

[Error] ORA-00904: invalid identifier

现在尝试PostgreSQL中语义相同的东西:

CREATE OR REPLACE FUNCTION public.foo ()
    RETURNS integer AS
$body$
    BEGIN
        select a;
        return a;
    END;
$body$
LANGUAGE plpgsql;

你会看到它 – 不幸的是! – 执行正常…没有报告错误.

但是,当您尝试调用此函数(即在运行时)时,您将获得:

ERROR:  column "a" does not exist
LINE 1: select a

有没有办法强制PostgreSQL在函数定义时执行语法分析和检查 – 而不是在运行时?我们有很多传统的PL / SQL代码在工作,我们正在移植到PostgreSQL – 但缺乏编译时检查是非常痛苦的,迫使我们做手工工作 – 即编写代码来测试所有函数中的所有代码路径/程序 – 在Oracle中以其他方式自动化.

解决方法

是的,这是一个已知问题.

PL / pgSQL(与SQL上的任何其他函数一样)是PostgreSQL的“黑盒子”,因此除了在运行时之外,它实际上不可能检测到错误.

你可以做几件事:

>将调用SQL查询的函数包装到BEGIN / COMMIT语句中,以便更好地控制错误;
>在代码中添加EXCEPTION blocks以捕获和跟踪错误.但请注意,这会影响功能性能;
>使用由PavelStěhule开发的plpgsql_check extension,他是PL / pgSQL开发的主要贡献者之一.我想最终这个扩展会使它成为PostgreSQL的核心,但它需要一些时间(现在我们处于9.4beta3状态);
>您也可以查看这个相关问题:postgresql syntax check without running the query

而且看起来你真的需要一个单元测试框架.

大佬总结

以上是大佬教程为你收集整理的PostgreSQL与Oracle:PL / pgSQL的“编译时”检查全部内容,希望文章能够帮你解决PostgreSQL与Oracle:PL / pgSQL的“编译时”检查所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ群:277859234,请注明来意。