一尘不染

为什么此存储过程将NULL值插入表中?

sql

我试图将数据(2列)从加载XML_HOURS_LOAD (columns: code,product)到称为的表中,STAGING (columns: code, product)并且正在为两列插入空值:

所以我有以下存储过程:

Create or Replace Procedure Cascade_Load (
   p_code in XML_HOURS_LOAD.p_code%TYPE,
   p_product in XML_HOURS_LOAD.p_product%TYPE
)
AS
BEGIN
   INSERT INTO STAGING(code, product)
   VALUES(p_code, p_product)

   COMMIT;
END;

我究竟做错了什么?提前致谢。


阅读 132

收藏
2021-05-16

共1个答案

一尘不染

要回答为什么插入空值的问题,这是因为在执行过程时没有为过程参数提供任何值。

根据您在问题中所说的和上面的评论,看来您在使用Oracle时缺少了一些基本技能。您编写的代码是一个过程,而不是一个函数,因此您不能在SELECT语句中调用它。在plsql块内部调用一个过程。编写的过程带有两个参数,您必须通过调用代码将其传递给过程调用。您编写的过程代码不会从XML_HOURS_LOAD表中查找数据。

我们都是学习Oracle的新人。您将需要查看一些教程,以开始使用pl / sql编码的基础知识,以帮助您清除函数与存储过程之间的差异以及如何使用参数实参。

从您在问题中所写的内容,我相信这是您想要的代码:

DECLARE
   p_code IS XML_HOURS_LOAD.code%TYPE,
   p_product IS XML_HOURS_LOAD.product%TYPE;
   CURSOR cXmlHoursLoadCursor IS (SELECT code, product FROM xml_hours_load); --You can add a WHERE condition to this cursor query
BEGIN
    FOR v IN cXmlHoursLoadCursor LOOP
       Cascade_Load(v.code, v.product);
       COMMIT; --I recommend calling commit here instead of inside your stored procedure so that the calling code has control of the transaction state
    END LOOP;
END;
2021-05-16