【问题标题】:PLS-00323 in Oracle: subprogram must be defined in the package bodyOracle 中的 PLS-00323:必须在包体中定义子程序
【发布时间】:2020-04-17 08:00:45
【问题描述】:

我是 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”在包中声明 规范,必须在包体中定义

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

【问题讨论】:

  • 尝试将参数也添加到正文中的函数中。
  • @sgalem 你的意思是函数 FUNC_OSA(inp_SKU in number,func_store_id in number,func_start_date in DATE,func_end_date in DATE)?我试过了,没有用,只会导致更多错误
  • 这会导致更多错误,因为您将现在作为参数的变量留在了函数声明部分,不是吗?
  • @Katya 有时“更多错误”是进步,因为这意味着您已经处理了第一个错误并继续处理下一个问题。

标签: oracle plsql


【解决方案1】:

您必须按照包规范定义您的函数。

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;

【讨论】:

  • @unus-haznedar 谢谢!!但是我也有一个错误,包的名称和模式的名称必须与编辑对象匹配(显然是函数 FUNC_OSA)。请问您也可以解决这个问题吗?
  • 我不明白,到底是什么问题?您在 MBA 架构中创建了规范和正文。
  • @YUNUS_HAZNEDAR 我也不明白。但是由于上述错误导致包无法编译
  • 能否请您用 Oracle 代码写出确切的信息?
猜你喜欢
  • 2014-12-18
  • 2019-02-19
  • 2021-08-11
  • 2016-09-18
  • 2022-01-04
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多