【问题标题】:How to get return value from stored procedure with output parameter in Grails?如何在 Grails 中使用输出参数从存储过程中获取返回值?
【发布时间】:2016-03-08 16:11:49
【问题描述】:

我有一个存储过程,它的输出参数是游标

这是我目前使用的存储过程的代码,不知道如何获取返回值

def kf_fpy
sql.call("{call calfpy(?,?,?,?,?)}",[workcenter,product,stattime,endtime,Sql.resultSet(OracleTypes.CURSOR)])

{
                cursorResults ->
                   cursorResults.eachRow() {
                        x ->
                          kf_fpy = x.getAt('kf_fpy')//ERROR OCCURED
                   }
}

我得到一个错误“方法抛出'java.lang.NullPointerException'异常。无法评估$Proxy11.toString()”

存储过程:

PROCEDURE CALFPY(workcenter in varchar2,produ in varchar2,stdt in varchar2,etdt in varchar2,p_out out pkg_package.type_cursor)

PKG_PACKAGE:

create or replace
package pkg_package 
as 
type type_cursor is ref cursor; 
type type_record is record 
( 
kf_ws varchar2(20), 
kf_fpy number,
kf_tfpy number,
kf_pro varchar2(200)

); 
end;

enter image description here

【问题讨论】:

  • 您能粘贴更多详细信息的堆栈跟踪吗?缺少哪个属性以及代码的哪一行?
  • 感谢您的回复,我要做的是创建一个webservice,所以我可以在webservice中调用oracle存储过程,但是过程的返回值是一个CURSOR,我有不知道如何准确获取返回值,能给我举个例子吗?

标签: oracle grails stored-procedures intellij-idea


【解决方案1】:

查看this solution:

程序

create or replace procedure GRAILS_EXAMPLE
(
  v_name IN VARCHAR2,
  ref_cur1 IN OUT SYS_REFCURSOR
)
AS
begin

  OPEN ref_cur1 FOR
  SELECT UPPER(v_name) AS UPPER_NAME
  FROM DUAL;

end GRAILS_EXAMPLE;

调用过程的控制器

    String upperName;
    sql.call("BEGIN GRAILS_EXAMPLE(?,?); END;",
            [params.name, Sql.resultSet(OracleTypes.CURSOR)]) {cursorResults ->

            if (cursorResults.next()) {
                 upperName = cursorResults.getAt('UPPER_NAME');
            }

    }

如果您需要获取 proc 中没有正确别名的字段 你仍然可以通过它的索引来访问它。例如以下将 也可以在上面的控制器中工作:

upperName = cursorResults.getAt(0)

如果您需要从过程中获取更多值,请查看this answer

【讨论】:

  • 非常感谢,在您的帮助下我已经解决了,您是对的,该字段在 proc 中没有正确别名,但 getAt(0) 仍然有效,再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多