【问题标题】:Calling an Oracle procedure with an IN OUT parameter type from Groovy从 Groovy 调用具有 IN OUT 参数类型的 Oracle 过程
【发布时间】:2013-07-27 04:46:55
【问题描述】:

我已经对此进行了搜索并尝试了很多东西,所以我希望有人可以帮助我。

我有一个 Oracle 包,其中包含具有以下参数的过程:

  PROCEDURE g$_verify_password1_prd
      ( p_object   IN     VARCHAR2,
        p_version  IN     VARCHAR2,
        p_password IN OUT VARCHAR2,
        p_role     OUT    VARCHAR2 )

这是一个 API 调用,由我们的供应商编写,我无法修改,也不想修改。我的问题是 p_password IN OUT 参数。从 Groovy 调用它的语法是什么?我在搜索此问题的答案时发现了 Sql.inout,但无法接受。这是我的代码,请记住我已经尝试了很多东西,这只是我离开的地方:

sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', 
    [$p_object, p_version, ${Sql.inout(Sql.VARCHAR(p_password))}, Sql.VARCHAR], 
    { p_password, p_rol ->
        //p_password = p_pass
        p_role = p_rol
        println p_password
        println p_rol
    }

我不断收到类似以下的错误:

Caught: groovy.lang.MissingPropertyException: No such property: _SECURITY for class: banner.CheckSecurityService
    at banner.CheckSecurityService.SecurityCheck(CheckSecurityService.groovy:49)
    at banner.Hello2Service.main(Hello2Service.groovy:20)

如果我删除 sql.inout 并只传入一个变量,它会运行但不正确,因为它没有从 Oracle 返回密码变量。在 IN OUT 参数之前,我已经成功地从这个包中调用了许多程序而没有问题,所以我必须缺少一些简单的东西。

【问题讨论】:

  • 查看错误,问题出在G$_SECURITY,具体来说是$_SECURITY。当前面加上$ _SECURITY 被视为变量。您是否在应用程序中使用双引号 ",但我看到您使用了有问题的 '
  • 这就是为什么我说我“成功地从这个包中调用了许多程序而没有问题”。 :) 我之前遇到了 $ 问题并更正了它。如果我去掉 sql.inout 并只传入一个变量并继续使用与 $ 相同的包名称,错误就会消失,但行为不是预期的。

标签: oracle groovy package procedure


【解决方案1】:

sql 可以是这样的:

sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', 
    [$p_object, p_version, Sql.inout(Sql.VARCHAR(p_password)), Sql.VARCHAR], 
    { p_password, p_rol ->
        //p_password = p_pass
        p_role = p_rol
        println p_password
        println p_rol
    }

*未经数据库直接测试。

【讨论】:

  • 啊,我没注意到你和上面评论的是同一个人。做到了,非常感谢dmahapatro!我想我尝试了很多选择,一段时间后我感到困惑。我会将其标记为正确答案。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2015-01-07
  • 2021-04-04
  • 2018-12-23
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多