oracle - 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”在包规范中声明,必须在包主体中定义
我试图声明它,但我没有成功。
解决方案
您必须按照包规范定义您的功能。
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;
推荐阅读
- r - 有人可以帮我理解为什么会出现此错误消息吗?
- python - 在 cv2 代码执行期间,MacOS 相机不可见
- python - 使用 Python 检测 API 中的更改
- reactjs - 为什么 React 浅比较不会注意到引用的变化?
- git - 使用 git,将现有子目录删除后上传新目录到 Github,而不删除当前删除的目录。来自 Github
- c# - ZKemKeeper:一些实时事件没有触发
- ethereum - 这个项目是如何成功骗取质押资产并将其直接提取到他们的钱包中的?
- html - 如何将图像放在不同的列中?
- python - 超出时间限制错误 - 当我尝试运行 Python 3 代码时
- python - 试图在pygame中使用colliderect?