首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法访问私有的plsql过程来进行测试?

有没有办法访问私有的plsql过程来进行测试?
EN

Stack Overflow用户
提问于 2011-07-20 20:19:57
回答 3查看 2.8K关注 0票数 17

我正在做一个有很多plsql代码的项目,我想在我们的代码库中添加更多具体的单元测试。我喜欢测试的一些过程/函数不在包规范中,我没有办法改变它。

有没有办法访问这些“私有”plsql过程而不将它们添加到规范中?

到目前为止,我唯一的想法是在测试之前为DB编译一个特殊的包规范,它指定了测试中的过程。我猜这会起作用,但我想知道是否有更简单的方法,也许是一些邪恶的秘密神谕黑客;-)

我在Java中使用JUnit/DBUnit进行测试。

BR Frank

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-20 22:33:07

有一种方法可以做到这一点,前提是你使用的是10g或更高版本。它被称为条件编译。这是一个非常整洁的特性,它提供了特殊的语法,因此我们可以在编译时更改我们的PL/SQL代码。

碰巧的是,我一直在使用这个特性在规范中公开私有包,这样我就可以对它们运行UTPLSQL测试。

下面是特殊的语法:

create or replace package my_pkg
as

    $IF $$dev_env_test $THEN

    PROCEDURE private_proc;

    $END

    FUNCTION public_function return date;

end my_pkg;
/

带有双美元符号的变量是条件编译标志。

如果我描述这个包,我们只能看到public包:

SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

现在我设置了条件标志并重新编译了包,就像变魔术一样……

SQL> alter session set plsql_ccflags='dev_env_test:true'
  2  /

Session altered.

SQL> alter package my_pkg compile
  2  /

Package altered.

SQL> desc my_pkg
PROCEDURE PRIVATE_PROC
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

函数的私营化就像您想象的那样简单:

SQL> alter session set plsql_ccflags='dev_env_test:false'
  2  /

Session altered.

SQL> alter package my_pkg compile
  2  /

Package altered.

SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE

SQL>

我们可以用条件编译做更多的事情。文件里都写了。Find out more.

票数 26
EN

Stack Overflow用户

发布于 2011-07-20 20:44:20

如果存在这样的东西,我会感到惊讶。私有过程、函数和变量的全部目的是使它们对包之外的应用程序不可见。

票数 2
EN

Stack Overflow用户

发布于 2011-07-20 21:04:02

正如@Robert所说,应该不可能访问任何仅在该包之外的包体中声明的内容。此外,创建一个用于运行单元测试的“特殊”规范也可能行不通:如果主体包含正向声明(类似于规范中的语句,通常可以在主体的开头找到),那么“特殊”规范将与这些声明冲突,包将无法编译。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6761782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档