【问题标题】:UTplsql returning ora -01031 insufficient priveleges when testing a refcursor as out parameter in procedureUTplsql 在过程中将 refcursor 测试为 out 参数时返回 ora -01031 权限不足
【发布时间】:2013-08-30 18:01:21
【问题描述】:

我正在测试一个将 ref cursor 作为 out 参数的过程。但结果显示“无法运行:ORA 01031 Insufficient priveleges

这是我的程序。很简单

PROCEDURE pr_plazalist_get(pn_facility_id  IN facility.facilityid%TYPE
                         ,pcur_plaza_info OUT gtcur_plaza_info) IS

   BEGIN
     OPEN pcur_plaza_info FOR
     SELECT p.plazaid      AS plazaid
           ,p.plazanm      AS plazaname
           ,p.plazaacronym AS palazaacronym
       FROM plaza    p
           ,facility f
      WHERE p.facilityid = f.facilityid
        AND f.facilityid = pn_facility_id;

   END pr_plazalist_get;

我在包的规范中声明了如下类型

TYPE gtrec_plaza_info IS RECORD(
   plazaid      plaza.plazaid%TYPE
  ,plazaname    plaza.plazanm%TYPE
  ,plazaacronym plaza.plazaacronym%TYPE);

TYPE gtcur_plaza_info IS REF CURSOR RETURN gtrec_plaza_info;

这里是utplsql的测试包体;

CREATE OR REPLACE PACKAGE BODY ut_pkg_utility_interface AS
 PROCEDURE ut_setup AS
 BEGIN
  NULL;
 END ut_setup;

PROCEDURE ut_teardown AS
 BEGIN
  NULL;
END ut_teardown;

 PROCEDURE ut_pr_plazalist_get IS
  l_in_params  utplsql_util.utplsql_params;
  l_out_params utplsql_util.utplsql_params;

   BEGIN
  utplsql_util.reg_in_param(par_pos => 1, par_val => 1, params => l_in_params);

  utplsql_util.reg_out_param(par_pos => 2, par_type => 'REFCURSOR', params =>    l_out_params);

  utassert.eq_refc_query(p_msg_nm        => 'refcursor test '
                        ,proc_name       => 'pkg_utility_interface.pr_plazalist_get'
                        ,params          => l_in_params
                        ,cursor_position => 2
                        ,qry             => 'SELECT plazaid,plazanm,plazaacronym from plaza p, facility f
                      where p.plaza.facilityid=facility.facilityid where facility.facilityid=1 ');
 END ut_pr_plazalist_get;

END ut_pkg_utility_interface;

当我测试它时,它给了我 FAILURE - pkg_utility_interface.UT_PR_PLAZALIST_GET:无法运行 ut_pkg_utility_interface.UT_PR_PLAZALIST_GET:ORA-01031:权限不足。我的代码和测试包在同一个架构

这是我的测试脚本 开始 utplsql.test('PKG_UTILITY_INTERFACE',samepackage_in => FALSE,recompile_in => false); 结尾; 这是我的结果 .

FFFFFFF AA III L U U RRRRR EEEEEEE F A A I L U U R R E
F A A I L U U R R E
F A A I L U U R R E
FFFF A A I L U U RRRRRR EEEE
F AAAAAAAAAA I L U U R R E
F A A I L U U R R E
F A A I L U U R R E
F A A III LLLLL L UUU R REEEEEE . 失败:“PKG_UTILITY_INTERFACE” . 单个测试用例结果:

FAILURE - PKG_UTILITY_INTERFACE.UT_PR_PLAZALIST_GET:无法运行 ut_PKG_UTILITY_INTERFACE.UT_PR_PLAZALIST_GET:ORA-01031:权限不足

utPLSQL 错误日志中记录的错误:

没有找到

【问题讨论】:

  • 一切都在同一个模式中 - pkg_utility_interface(如果存在并且不仅仅是错误消息中的错误),ut_pkg_utility_interfaceutplsql_utilutassertplazafacility,还有什么我错过的......以及调用它的代码?你也能证明这一点,以及完整的错误堆栈吗?看起来有些东西正在捕获异常并丢失上下文,但似乎可能是链中某处的身份验证问题。
  • 最初,为单元测试创​​建了一个单独的模式,称为 UTP,其中安装了 utplsql。我在 UTP 中有我的测试脚本 ut_pkg_utility_interface 和在另一个模式中测试的代码。我已将 pkg_utility_interface 包的 EXECUTE 权限授予 UTP 模式。我已经在 UTP 中执行了我的测试脚本,这给了我错误名为“PKG_UTILITY_INTERFACE”的程序不存在。所以我想解决方法,然后将 ut_pkg_utility_interface 放入存在 pkg_utility_interaface 的架构中。上面包含测试脚本和错误消息
  • 这里的关系仍然很难理解。除了ORA-01031 本身之外,错误中的所有内容都是由您的代码生成的,所以有些东西正在捕获它,并且显然压缩了错误堆栈,因此您看不到真正导致它的原因,这将有所帮助。 UTP 对主架构中的包和表的权限是直接授予还是通过角色授予?
  • 对包的权限是直接授予 UTP 而不是通过角色。看起来 ref 游标引起了问题。我改变了程序只是为了返回 OUT 参数而不是 refcursor 并在这里使用了 utsassert.eq ,它工作得很好。 UTPLSQL 中是否存在与 refcursors 相关的错误?

标签: oracle unit-testing plsql


【解决方案1】:

“ORA-01031:权限不足”是由于 utPLSQL 需要临时创建表而导致的。为此,它使用EXECUTE IMMEDIATE。为此,用户需要直接授予他们CREATE TABLE 权限,而不是通过角色(另请参阅https://stackoverflow.com/a/996709)。

使用utplsql_util.reg_in_paramutplsql_util.reg_out_param 设置参数时,您需要使用相同的params 变量。您要比较的 SELECT 语句中也有一些错字。因此,您的测试包主体应该是:

CREATE OR REPLACE PACKAGE BODY ut_pkg_utility_interface AS
 PROCEDURE ut_setup AS
 BEGIN
  NULL;
 END ut_setup;

PROCEDURE ut_teardown AS
 BEGIN
  NULL;
END ut_teardown;

 PROCEDURE ut_pr_plazalist_get IS
  l_params  utplsql_util.utplsql_params;

   BEGIN
  utplsql_util.reg_in_param(par_pos => 1, par_val => 1, params => l_params);

  utplsql_util.reg_out_param(par_pos => 2, par_type => 'REFCURSOR', params =>    l_params);

  utassert.eq_refc_query(p_msg_nm        => 'refcursor test '
                        ,proc_name       => 'pkg_utility_interface.pr_plazalist_get'
                        ,params          => l_params
                        ,cursor_position => 2
                        ,qry             => 'SELECT plazaid,plazanm,plazaacronym from plaza p, facility f
                      where p.facilityid=f.facilityid and f.facilityid=1 ');
 END ut_pr_plazalist_get;

END ut_pkg_utility_interface;

[全面披露:我是 utPLSQL 项目的管理员之一]

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2021-12-30
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多