PostgreSQLはオーバーロード可能
Oracleはパッケージ内のプロシージャならオーバーロード可能
MySQLとSQL Serverはオーバーロード不可
(8.0.29)
サポートされていない模様
念のため確認
drop procedure proc1;
delimiter //
create procedure proc1(
in param1 numeric
)
begin
select param1;
end
//
delimiter ;
delimiter //
create procedure proc1(
in param1 varchar(30)
)
begin
select param1;
end
//
delimiter ;
select *
from information_schema.routines
where routine_type = 'PROCEDURE'
and routine_name = 'proc1'\G
→ オーバーロードをサポートしていない
(19c)
-- 1. プロシージャの場合
create or replace procedure proc1(
param1 in number
)
as
begin
dbms_output.put_line( param1 );
end;
/
show error;
create or replace procedure proc1(
param1 in varchar2
)
as
begin
dbms_output.put_line( param1 );
end;
/
show error;
create or replace procedure proc1(
param1 in number
,param2 in varchar2
)
as
begin
dbms_output.put_line( param1 );
dbms_output.put_line( param2 );
end;
/
show error;
select * from user_objects where object_type = 'PROCEDURE';
set serveroutput on
exec proc1(1);
exec proc1('A');
exec proc1(2,'B');
→ オーバーロードをサポートしていない
-- 2. プロシージャの場合
create or replace package pkg1
as
procedure proc1 (param1 in number);
procedure proc1 (param1 in varchar2);
procedure proc1 (param1 in number, param2 in varchar2);
end;
/
show error;
create or replace package body pkg1
as
procedure proc1(
param1 in number
)
as
begin
dbms_output.put_line( param1 );
end;
procedure proc1(
param1 in varchar2
)
as
begin
dbms_output.put_line( param1 );
end;
procedure proc1(
param1 in number
,param2 in varchar2
)
as
begin
dbms_output.put_line( param1 );
dbms_output.put_line( param2 );
end;
end;
/
show error;
set serveroutput on
exec pkg1.proc1(1);
exec pkg1.proc1('A');
exec pkg1.proc1(2,'B');
→ オーバーロードをサポートしている
(14)
create or replace procedure proc1(
param1 in numeric
)
language plpgsql
as $$
declare
begin
raise info '%', param1;
end;
$$;
create or replace procedure proc1(
param1 in varchar
)
language plpgsql
as $$
declare
begin
raise info '%', param1;
end;
$$;
create or replace procedure proc1(
param1 in numeric
,param2 in varchar
)
language plpgsql
as $$
declare
begin
raise info '%', param1;
raise info '%', param2;
end;
$$;
\df proc1
call proc1(1);
call proc1('A');
call proc1(2,'B');
→ オーバーロードをサポートしている
(2019)
サポートされていない模様
念のため試してみる
create or alter procedure proc1(
@param1 numeric
)
as
begin
print @param1;
end
go
create or alter procedure proc1(
@param1 numeric
,@param2 varchar
)
as
begin
print @param1;
end
go
select * from sys.objects where type in ('P');
go
exec proc1 1;
go
exec proc1 1,'A';
go
→ オーバーロードをサポートしていない