【发布时间】: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_interface,utplsql_util,utassert,plaza,facility,还有什么我错过的......以及调用它的代码?你也能证明这一点,以及完整的错误堆栈吗?看起来有些东西正在捕获异常并丢失上下文,但似乎可能是链中某处的身份验证问题。 -
最初,为单元测试创建了一个单独的模式,称为 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