Oracle PLS-00306 wrong number or types of arguments
Oracle PLS-00306 wrong number or types of arguments
有時後為了方便,會在 oracle package 裡面自訂義一些 type,讓使用範圍只限縮在同一支 package 裡內。但一時不查,居然就踩中了雷, debug 了二個小時才發現一個低級錯誤……
底下是二個支 package 的建立語法。主要概念就是 package “p_a” 已經是原有的 package,這時後新做了其他功能,但有些 db 操作既有的 p_a 已經有了,可以直接呼叫「insert_nums」這支 procedure。
於是就建立了 package “p_b” ,然後在裡面直接呼叫 p_a.insert_nums。
create or replace package p_a as
type number_array is table of number;
procedure insert_nums(
nums number_array
);
end p_a;
/
create or replace package body p_a as
procedure insert_nums(
nums number_array
)
as
begin
for i = 1 .. nums.count loop
insert into t_a values(nums(i));
end loop;
end insert_nums;
end p_a;
create or replace package p_b as
type number_array is table of number;
procedure insert_nums_v2(
nums number_array
);
end p_b;
/
create or replace package body p_b as
procedure insert_nums_v2(
nums number_array
)
as
begin
insert into t_log values('abc');
p_a.insert_nums(nums);
end insert_nums_v2;
end p_b;
原本的概念是建立一支新的 package “p_b”,然後新增一些新的邏輯,接著再呼叫原本的 p_a.insert_nums。
但沒想到一直狂中 PLS-00306 wrong number or types of arguments 這個錯誤……
由於實際 production 的版本裡面傳遞的參數多達四、五十個,所以一時也沒發現是這個 collection的問題。
一直到快放棄的時後,拉到 package 的最上面才發現,這個 number_array 是在 package 裡面自定義的,不是定義在 db 裡面的 type……
所以簡單講,就是有二個不同的 type,一個叫 p_a.number_array,另一個叫 p_b.number_array……
想不到一時的不注意,就浪費了二個小時……
所以把 p_b 裡面的 type 改成 p_a.number_array 就可以正常呼叫 p_a.insert_nums了……
Note:低級的失誤,蛋蛋的哀傷…