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语句中,以便更好地控制错误; 而且看起来你真的需要一个单元测试框架. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |