Para responder à sua pergunta de por que está inserindo nulos, é porque você não está fornecendo nenhum valor aos parâmetros do procedimento ao executá-lo.
Com base no que você afirmou na pergunta e no seu comentário acima, parece que você está perdendo algumas habilidades fundamentais ao trabalhar com a Oracle. O código que você escreveu é um procedimento, não uma função, então você não pode chamá-lo em um
SELECT
declaração. Um procedimento é chamado dentro de um bloco plsql. Seu procedimento conforme escrito recebe dois argumentos, que você deve passar para a chamada de procedimento por meio do código de chamada. O código do procedimento que você escreveu não procura dados do XML_HOURS_LOAD
tabela. Todos nós fomos a nova pessoa aprendendo Oracle. Você vai querer ver alguns tutoriais para começar nos fundamentos da codificação pl/sql para ajudar a esclarecer as diferenças entre funções e procedimentos armazenados e como usar argumentos de parâmetro.
Pelo que você escreveu em sua pergunta, acredito que este seja o código que você deseja:
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;