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

时间:2018-02-07 22:10:09

标签: sql database oracle stored-procedures plsql

我正在尝试将数据(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;

我做错了什么?谢谢你提前。

1 个答案:

答案 0 :(得分: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;