我试图将数据(2列)从加载XML_HOURS_LOAD (columns: code,product)到称为的表中,STAGING (columns: code, product)并且正在为两列插入空值:
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;
我究竟做错了什么?提前致谢。
要回答为什么插入空值的问题,这是因为在执行过程时没有为过程参数提供任何值。
根据您在问题中所说的和上面的评论,看来您在使用Oracle时缺少了一些基本技能。您编写的代码是一个过程,而不是一个函数,因此您不能在SELECT语句中调用它。在plsql块内部调用一个过程。编写的过程带有两个参数,您必须通过调用代码将其传递给过程调用。您编写的过程代码不会从XML_HOURS_LOAD表中查找数据。
SELECT
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;