【发布时间】: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 有时“更多错误”是进步,因为这意味着您已经处理了第一个错误并继续处理下一个问题。