首页 > 解决方案 > Oracle 中的 PLS-00323:必须在包体中定义子程序

问题描述

我是 SQL 的新手。

我尝试用函数定义一个包

规格:

CREATE OR REPLACE PACKAGE MBA.OSA
AS
  FUNCTION FUNC_OSA 
  (inp_SKU in number, func_store_id in number, func_start_date in DATE, func_end_date in DATE)
  RETURN NUMBER;
END OSA;

还有身体

CREATE OR REPLACE PACKAGE BODY MBA.OSA as
function FUNC_OSA 

return number
IS 
p_OSA NUMBER;
func_start_date date;
func_end_date date;
inp_SKU number;
func_store_id number;

BEGIN
with period_len as (
select (func_end_date - func_start_date) len_per from dual
),
OSA_ as (
select dm.SKU,
      dm.store_id,
     ROUND(count(distinct dm.TRAN_DATE) / (select len_per from period_len) * 100,0) OSA
    --into OSA
    from datamarts.SALES_DETAIL_DM dm
    where SKU = inp_SKU
    AND TRAN_DATE between func_start_date and func_end_date
    AND dm.store_id = func_store_id
group by dm.SKU, dm.store_id
)
select OSA into p_OSA from OSA_;

RETURN p_OSA;
END FUNC_OSA;

END OSA;

但我得到了错误

PLS-00323:子程序或游标“FUNC_OSA”在包规范中声明,必须在包主体中定义

我试图声明它,但我没有成功。

标签: oracleplsql

解决方案


您必须按照包规范定义您的功能。

CREATE OR REPLACE PACKAGE BODY MBA.OSA as

function FUNC_OSA  (inp_SKU in number, func_store_id in number, func_start_date in DATE, func_end_date in DATE) RETURN NUMBER
IS 
p_OSA NUMBER;
BEGIN
with period_len as (
select (func_end_date - func_start_date) len_per from dual
),
OSA_ as (
select dm.SKU,
      dm.store_id,
     ROUND(count(distinct dm.TRAN_DATE) / (select len_per from period_len) * 100,0) OSA
    --into OSA
    from datamarts.SALES_DETAIL_DM dm
    where SKU = inp_SKU
    AND TRAN_DATE between func_start_date and func_end_date
    AND dm.store_id = func_store_id
group by dm.SKU, dm.store_id
)
select OSA into p_OSA from OSA_;

RETURN p_OSA;
END FUNC_OSA;

END OSA;

推荐阅读