Oracle PLS-00306 wrong number or types of arguments

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:低級的失誤,蛋蛋的哀傷…