我正在为我的Oracle数据库设置utPL / SQL,一切似乎都安装正确,但是当我尝试运行基本测试运行器时,它会出错:ORA-04047: object specified is incompatible with the flag specified
创建了一个基本的空测试包,我运行了行begin ut.run(); end;
这给了我以下错误:
Error starting at line : 1 in command -
BEGIN ut.run(); END;
Error report -
ORA-04047: object specified is incompatible with the flag specified
ORA-06512: at "UNIT_TEST_REPOS.UT_RUNNER", line 88
ORA-06512: at "UNIT_TEST_REPOS.UT_RUNNER", line 112
ORA-06512: at "UNIT_TEST_REPOS.UT", line 292
ORA-06512: at "UNIT_TEST_REPOS.UT", line 267
ORA-06512: at line 1
04047. 00000 - "object specified is incompatible with the flag specified"
*Cause: The object type implied by the flag does not match the type
of object specified.
*Action: Specify the correct object, or use the appropriate flag
应该会发生以下情况:
Between string function
Finished in .451423 seconds
0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)
create_utplsql_owner.sql
,执行了install.sql
脚本,并执行了create_synonyms_and_grants_for_public.sql
。这些是安装指南要执行的所有脚本。一切似乎都有效 - 我没有看到任何错误。 (仔细检查了install.log文件 - 没有错误)。在utPLSQL文档的getting started tutorial中,我创建了(大部分为空)测试包,完全如标题创建测试包
中所述create or replace package test_betwnstr as
-- %suite(Between string function)
end;
我在使用Oracle方面经验有限。在一些digging around之后,我得到了更多可能导致错误的背景 - 似乎它可能与冲突的名称有关,但我不知道哪些名称会相互冲突。再一次,这只是来自全新安装的utPLSQL,所以似乎有些东西是错误配置的,但我不知道是什么......
我查看了其他问题,但它们与用户权限不足有关。我使用管理员帐户(称为CORE)运行脚本。
utPL / SQL版本:3.0.2
Oracle版本:11.2
我查看了错误所指向的UT代码行,我在" UNIT_TEST_REPOS.UT",第267行看到了代码如下:ut.run(ut_varchar2_list(sys_context('userenv', 'current_schema')), a_reporter, a_color_console, a_coverage_schemes, a_source_file_mappings, a_test_file_mappings, a_include_objects, a_exclude_objects );
所以user environment
或current-schema
设置似乎有问题?我查找了那些(SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL;
)的值,它返回了CORE--我用来安装脚本的sys管理员用户名。
排序可以让它工作......当我最初运行命令时,我被连接为我的默认用户CORE。我创建了一个新的连接作为我的UNIT_TEST_REPOS模式,然后我可以将它连接到" work"通过使用命令select ut.run() from dual;
,它将其作为表格返回。
UNIT_TEST_REPOS.UT_VARCHAR2_ROWS('Finished in 0 seconds', '0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)', ' ')
这适用于我的空测试场景,但是当我继续教程并添加真实测试用例时,它给了我相同的结果......
因此,通过连接作为不同的模式,我可以执行没有错误的代码。但它看不到其他用户的测试,所以这不是一个解决方案......
使用SQLTools而不是SQL Developer来查看数据库,它显示了错误消息的更多详细信息。
我还在Google书籍 Oracle数据库的秘密中找到了有关oracle错误的信息,它有这个部分:
如果在指定的上下文中无法解析名称,则" ORA-06564:object object_name 不存在"引发,其中 object_name 是传递给过程NAME_RESOLVE的参数NAME的值。 如果在错误的上下文中解析现有对象,则指定的异常" ORA-04047:对象与指定的标志不兼容"被抛出。(大胆强调我的)
此外,当我尝试在UNIT_TEST_REPOS模式中执行测试脚本,并让它在我的CORE模式中显式调用测试时,
begin ut.run('CORE'); end;
它与之前的错误相同。
从本书的建议来看,听起来像utPLSQL用作其框架一部分的标志有错误。但它看起来与教程相同......
答案 0 :(得分:1)
如果您可以直接在utPLSQL项目上发布此类问题,那就太棒了。 https://github.com/utPLSQL/utPLSQL/issues
我们无法关注stackoverflow,google群组和所有其他媒体。 你应该面对的问题应该可以通过utPLSQL v3.0.4来解决。 这是Oracle命名空间问题,当对象和模式都是相同的名称时(从我看到的)。
答案 1 :(得分:0)
不是解决方案,而是旁路。
如果我在UNIT_TEST_REPOS中创建包,那么它可以看到测试并执行它们。好像在CORE模式中存在一些配置问题阻止utplsql正确挂钩。我使用了一个单独的模式并将包放在那里,并且utPLSQL能够运行那里的测试。
实际的解决方案是修复CORE中的配置设置,以便utPLSQL对象和标志能够正确地看到对方。但我不确定在哪里看。