【问题标题】:utPLSQL Installation - ORA-04047 error when exec ut.run();utPLSQL 安装 - 执行 ut.run() 时出现 ORA-04047 错误;
【发布时间】:2018-01-31 20:06:02
【问题描述】:

我正在为我的 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)

我做了什么:

  • 使用the installation guide here,我运行了windows脚本,通过执行为测试用户创建了模式 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

更新 1

我查看了错误指向的 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 environmentcurrent-schema 设置似乎有问题?我查找了那些 (SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL;) 的值,它返回了 CORE——我用来安装脚本的系统管理员用户名。

更新 2

可以让它工作......当我最初运行命令时,我作为我的默认用户 CORE 连接。我创建了一个新连接作为我的 UNIT_TEST_REPOS 架构,然后我可以使用命令 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)', ' ')

这适用于我的空测试场景,但是当我继续教程并添加真实的测试用例时,它给了我相同的结果...

因此,通过连接为不同的架构,我可以毫无错误地执行代码。但是它看不到其他用户的测试,所以这不是解决方案...

更新 3

使用 SQLTools 而不是 SQL Developer 查看数据库,它显示了错误消息的更多详细信息。

我还在 Google 书籍 Oracle 数据库的秘密 中找到了有关 Oracle 错误的信息,其中包含以下部分:

如果无法在指定的上下文中解析名称,则会引发“ORA-06564:对象 object_name 不存在”,其中 object_name 是参数的值NAME 传递给过程 NAME_RESOLVE。 如果在错误的上下文中解析现有对象,则会抛出异常“ORA-04047:指定的对象与指定的标志不兼容”。(我的粗体强调)

此外,当我尝试在 UNIT_TEST_REPOS 架构中执行测试脚本并让它在我的 CORE 架构中显式调用测试时,

begin ut.run('CORE'); end;

它得到了和以前一样的错误。

从这本书的建议来看,utPLSQL 作为其框架的一部分使用的标志听起来有一个错误。但它看起来和教程一样......

【问题讨论】:

  • 当我创建一个测试包时,我通常使用类似于BEGIN UTPLSQL.RUN(owner_in => 'MY_USER', testpackage_in => 'MY_UNIT_TEST_PACKAGE'); END; 的代码运行测试。请注意,我正在运行 utPL/SQL 2.2 版,所以可能情况已经发生了变化。
  • @BobJarvis 我试过了,但它给出了语法错误,我怀疑会发生这种情况。似乎开发人员完全从 v2 重写了 v3,因此语法发生了巨大变化。我认为问题不在于 run() 行,而是配置设置...
  • 感谢这篇文章。我完全错过了 utplsql 的升级。本周最佳新闻。我已经使用 2.2 大约十年了。抱歉,我还不能帮你解决你的问题,但我今晚要下载新版本。

标签: oracle unit-testing plsql installation


【解决方案1】:

如果您可以直接在 utPLSQL 项目上发布此类问题,那就太好了。 https://github.com/utPLSQL/utPLSQL/issues

我们无法关注 stackoverflow、google 群组和所有其他媒体。 您遇到的问题可能应该使用 utPLSQL v3.0.4 解决。 这是 Oracle 命名空间问题,当对象和模式的名称相同时(据我所知)。

【讨论】:

  • 注明。如果我将来在 utPLSQL(或其他开源项目)方面遇到麻烦,我会记住这一点,以便在他们的 Github 站点上提出任何问题。但也很高兴听到问题已解决。
【解决方案2】:

不是解决方案,而是绕过。

如果我在 UNIT_TEST_REPOS 中制作包,那么它可以看到测试并执行它们。似乎 CORE 模式中存在一些配置问题,导致 utplsql 无法正确挂钩。我使用了一个单独的模式并将包放在那里,utPLSQL 能够运行那里的测试。

实际的解决方案是修复 CORE 中的配置设置,以便 utPLSQL 对象和标志可以正确地看到彼此。但我不知道去哪里找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多