プロシージャのオーバーロード

PostgreSQLオーバーロード可能
Oracleはパッケージ内のプロシージャならオーバーロード可能
MySQLSQL 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

オーバーロードをサポートしていない