简体   繁体   English

如何从存储过程中使用Grails中的输出参数获取返回值?

[英]How to get return value from stored procedure with output parameter in Grails?

I have a stored procedure that has an output parameter which is a cursor 我有一个存储过程,其输出参数是游标

Here's the code for the stored procedure I currently use, I don't know how to get the return value 这是我当前使用的存储过程的代码,我不知道如何获取返回值

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
                   }
}

And I got an error "Method threw 'java.lang.NullPointerException' exception. Cannot evaluate $Proxy11.toString()" 我收到一个错误“方法引发'java.lang.NullPointerException'异常。无法评估$ Proxy11.toString()”

Stored Procedure: 存储过程:

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

PKG_PACKAGE: 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 在此处输入图片说明

Check out this solution : 看看这个解决方案

Procedure : 程序

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;

Controller which calls procedure : 调用程序的控制器

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

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

    }

If you need to get at a field that isn't properly aliased in your proc you can still access it by its index. 如果您需要获取未在proc中正确别名的字段,您仍然可以通过其索引访问它。 For example the follow would also work in the above controller: 例如,以下操作也可以在上述控制器中工作:

 upperName = cursorResults.getAt(0) 

If you need more values from procedure check out this answer . 如果您需要更多信息,请查看此答案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM