创建返回数据的Oracle存储过程

时间:2014-08-18 21:55:21

标签: oracle

在Firebird中,您可以创建一个返回数据的存储过程,并像传递参数的表一样调用它:

create or alter procedure SEL_MAS_IVA (
    PCANTIDAD double precision)
returns (
    CANTIDAD_CONIVA double precision)
as
begin
 CANTIDAD_CONIVA = pCANTIDAD*(1.16);
 suspend;
end

select * from SEL_MAS_IVA(100)

将返回单行单列(名为CANTIDAD_CONIVA)与值116的关系

这是一个非常简单的例子。存储过程当然可以具有任意数量的输入和输出参数,并且可以执行返回数据(包括多行)所需的任何操作,这可以通过“suspend”语句完成(顾名思义,暂停SP执行,返回数据给调用者,并在下一个语句中恢复)

如何在Oracle中创建此类存储过程?

2 个答案:

答案 0 :(得分:1)

在Oracle中,可以使用流水线功能。你的例子:

-- define column names:
CREATE OR REPLACE TYPE SEL_MAS_IVA_obj AS OBJECT (
  CANTIDAD_CONIVA NUMBER)
/
CREATE OR REPLACE TYPE SEL_MAS_IVA_type AS TABLE OF SEL_MAS_IVA_obj
/

CREATE OR REPLACE
FUNCTION SEL_MAS_IVA(PCANTIDAD IN NUMBER)
RETURN SEL_MAS_IVA_type
PIPELINED
 IS
BEGIN
 pipe row(SEL_MAS_IVA_obj(PCANTIDAD * 1.16));
 RETURN;
END;
/

并获取值:

SELECT * FROM TABLE(SEL_MAS_IVA(100));

另请参阅另一个示例,其中函数返回更多列和行:https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:4447489221109

答案 1 :(得分:0)

您需要使用一个功能:

create or replace function SEL_MAS_IVA (
    pCANTIDAD IN NUMBER
)
return NUMBER
as
begin
  return pCANTIDAD*(1.16);
end SEL_MAS_IVA;

select SEL_MAS_IVA(100) CANTIDAD_CONIVA from dual;