例如…
尝试在任何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
而且看起来你真的需要一个单元测试框架.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。