Oracle 使用一个输入和两个输出参数创建函数

Oracle 使用一个输入和两个输出参数创建函数,oracle,function,Oracle,Function,我想创建一个Oracle函数,它由一个输入参数和两个输出参数组成。下面是我写的代码 CREATE OR REPLACE FUNCTION GET_CMM_REPORT ( p_span_link_id IN nvarchar2, p_cmmapproved OUT SYS_REFCURSOR, p_cmm_tobe_approved OUT SYS_REFCURSOR ) RETURN VARCHAR2 AS BEGIN select ROUTE_APPROVED_

我想创建一个Oracle函数,它由一个输入参数和两个输出参数组成。下面是我写的代码

CREATE OR REPLACE FUNCTION GET_CMM_REPORT
 (
  p_span_link_id IN nvarchar2,
  p_cmmapproved  OUT SYS_REFCURSOR,
  p_cmm_tobe_approved  OUT SYS_REFCURSOR
) 
 RETURN VARCHAR2 AS 
 BEGIN
  select ROUTE_APPROVED_BY_CMM AS "CMM APPROVED" from TBL_FIBER_INV_CMPAPPROVED_INFO where 
 SPAN_LINK_ID= p_span_link_id
 and ROUTE_APPROVED_BY_CMM > 0;

select NE_LENGTH
from TBL_FIBER_INV_CMPAPPROVED_INFO where SPAN_LINK_ID= p_span_link_id;
 RETURN NULL;
END GET_CMM_REPORT;

我的函数是否正常,因为我是新创建oracle函数的。请建议如何实现这一点。

这应该在语法上有效

CREATE OR REPLACE FUNCTION GET_CMM_REPORT
 (
  p_span_link_id IN nvarchar2,
  p_cmmapproved  OUT SYS_REFCURSOR,
  p_cmm_tobe_approved  OUT SYS_REFCURSOR
) 
 RETURN VARCHAR2 AS 
 BEGIN
    open p_cmmapproved for 
      select ROUTE_APPROVED_BY_CMM AS "CMM APPROVED" 
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id
         and ROUTE_APPROVED_BY_CMM > 0;

    open p_cmm_tobe_approved for 
      select NE_LENGTH
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id;
    RETURN NULL;
END GET_CMM_REPORT;
但是,从逻辑上讲,具有两个
out
参数并返回硬编码的
null
的函数相当奇怪。您最好使用存储过程

CREATE OR REPLACE PROCEDURE GET_CMM_REPORT
 (
  p_span_link_id IN nvarchar2,
  p_cmmapproved  OUT SYS_REFCURSOR,
  p_cmm_tobe_approved  OUT SYS_REFCURSOR
) 
 AS
 BEGIN
    open p_cmmapproved for 
      select ROUTE_APPROVED_BY_CMM AS "CMM APPROVED" 
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id
         and ROUTE_APPROVED_BY_CMM > 0;

    open p_cmm_tobe_approved for 
      select NE_LENGTH
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id;
END GET_CMM_REPORT;

或者创建两个单独的函数,每个函数返回一个游标。

这在语法上应该是有效的

CREATE OR REPLACE FUNCTION GET_CMM_REPORT
 (
  p_span_link_id IN nvarchar2,
  p_cmmapproved  OUT SYS_REFCURSOR,
  p_cmm_tobe_approved  OUT SYS_REFCURSOR
) 
 RETURN VARCHAR2 AS 
 BEGIN
    open p_cmmapproved for 
      select ROUTE_APPROVED_BY_CMM AS "CMM APPROVED" 
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id
         and ROUTE_APPROVED_BY_CMM > 0;

    open p_cmm_tobe_approved for 
      select NE_LENGTH
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id;
    RETURN NULL;
END GET_CMM_REPORT;
但是,从逻辑上讲,具有两个
out
参数并返回硬编码的
null
的函数相当奇怪。您最好使用存储过程

CREATE OR REPLACE PROCEDURE GET_CMM_REPORT
 (
  p_span_link_id IN nvarchar2,
  p_cmmapproved  OUT SYS_REFCURSOR,
  p_cmm_tobe_approved  OUT SYS_REFCURSOR
) 
 AS
 BEGIN
    open p_cmmapproved for 
      select ROUTE_APPROVED_BY_CMM AS "CMM APPROVED" 
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id
         and ROUTE_APPROVED_BY_CMM > 0;

    open p_cmm_tobe_approved for 
      select NE_LENGTH
        from TBL_FIBER_INV_CMPAPPROVED_INFO 
       where SPAN_LINK_ID= p_span_link_id;
END GET_CMM_REPORT;


或者创建两个单独的函数,每个函数返回一个游标。

是否尝试编译代码?如果是,您是否得到任何错误或意外结果?(我可以看到,看起来您试图返回一些ref游标,但实际上您还没有在代码体中设置ref游标;您缺少了一些
open for…
语句。)至于如何实现它,这是一个很难回答的问题。它将如何命名?来自另一个PL/SQL过程?从一个应用程序?还有别的吗?我们不知道您的系统、要求或数据库!在我看来,切换到程序。带有两个OUT参数且返回NULL的函数(只是为了返回某些内容,因为不返回任何内容的函数是无效的)是无用的。@Boneist:是的,它将从另一个过程调用。。那么我如何继续创建这个函数呢。目前,我遇到了一个问题,因为
INTO子句应该包含在select语句中
@Boneist:我只是想通过一些google检查来实现这样的功能,但是,请帮助我创建它的方式,以便我可以从另一个存储过程调用它…@Littlefoot:请帮助我仅在函数中执行此操作您是否尝试编译代码?如果是,您是否得到任何错误或意外结果?(我可以看到,看起来您试图返回一些ref游标,但实际上您还没有在代码体中设置ref游标;您缺少了一些
open for…
语句。)至于如何实现它,这是一个很难回答的问题。它将如何命名?来自另一个PL/SQL过程?从一个应用程序?还有别的吗?我们不知道您的系统、要求或数据库!在我看来,切换到程序。带有两个OUT参数且返回NULL的函数(只是为了返回某些内容,因为不返回任何内容的函数是无效的)是无用的。@Boneist:是的,它将从另一个过程调用。。那么我如何继续创建这个函数呢。目前,我遇到了一个问题,因为
INTO子句应该包含在select语句中
@Boneist:我只是想通过一些google检查来实现这样的功能,但是,请帮助我创建它的方式,以便我可以从另一个存储过程调用它…@Littlefoot:请帮助我在函数中执行它,只需再问一件与此相关的事情。。如果你不介意,我可以继续吗?我想添加第三个out
sys\u refcursor
谁的查询将来自(第二个sys\u refcursor-第一个sys\u refcursor)。。那么如何实现这个逻辑呢@抬头显示器-这没有道理。无法基于另一个
sys\u refcursor
打开一个
sys\u refcursor
。您可以打开第三个游标,其查询恰好复制/组合了用于打开一个或另一个游标的查询中的部分或全部逻辑。但这将是一个单独的查询,不引用任何其他游标。哦。。。好的,让我和我的团队讨论一下。谢谢你的更新!!还有一件事,我们可以处理如果RoutEI批准了yxycmm或nyLead用于<代码> pSpaspLink kIDID <代码>没有任何行,那么默认情况下它应该被认为是<代码> 0 <代码>?如果你不介意,我可以继续吗?我想添加第三个out
sys\u refcursor
谁的查询将来自(第二个sys\u refcursor-第一个sys\u refcursor)。。那么如何实现这个逻辑呢@抬头显示器-这没有道理。无法基于另一个
sys\u refcursor
打开一个
sys\u refcursor
。您可以打开第三个游标,其查询恰好复制/组合了用于打开一个或另一个游标的查询中的部分或全部逻辑。但这将是一个单独的查询,不引用任何其他游标。哦。。。好的,让我和我的团队讨论一下。谢谢你的更新!!还有一件事,我们可以处理如果RoutEI批准了yxycmm或nyLead用于<代码> pSpaspLink kIDID <代码>没有任何行,那么默认情况下它应该被认为是<代码> 0 <代码>?