Oracle 使用一个输入和两个输出参数创建函数
我想创建一个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_
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:请帮助我在函数中执行它,只需再问一件与此相关的事情。。如果你不介意,我可以继续吗?我想添加第三个outsys\u refcursor
谁的查询将来自(第二个sys\u refcursor-第一个sys\u refcursor)。。那么如何实现这个逻辑呢@抬头显示器-这没有道理。无法基于另一个sys\u refcursor
打开一个sys\u refcursor
。您可以打开第三个游标,其查询恰好复制/组合了用于打开一个或另一个游标的查询中的部分或全部逻辑。但这将是一个单独的查询,不引用任何其他游标。哦。。。好的,让我和我的团队讨论一下。谢谢你的更新!!还有一件事,我们可以处理如果RoutEI批准了yxycmm或nyLead用于<代码> pSpaspLink kIDID <代码>没有任何行,那么默认情况下它应该被认为是<代码> 0 <代码>?如果你不介意,我可以继续吗?我想添加第三个outsys\u refcursor
谁的查询将来自(第二个sys\u refcursor-第一个sys\u refcursor)。。那么如何实现这个逻辑呢@抬头显示器-这没有道理。无法基于另一个sys\u refcursor
打开一个sys\u refcursor
。您可以打开第三个游标,其查询恰好复制/组合了用于打开一个或另一个游标的查询中的部分或全部逻辑。但这将是一个单独的查询,不引用任何其他游标。哦。。。好的,让我和我的团队讨论一下。谢谢你的更新!!还有一件事,我们可以处理如果RoutEI批准了yxycmm或nyLead用于<代码> pSpaspLink kIDID <代码>没有任何行,那么默认情况下它应该被认为是<代码> 0 <代码>?