create schema out_param_func_overload;
set current_schema= out_param_func_overload;
set behavior_compat_options='proc_outparam_override';


-- 0
create or replace package pkg_type 
as 
function func(i1 in int, o1 out number, o2 out varchar2) return number;
function func(i1 in int, i2 in int, o1 out number, o2 out varchar2) return number;
end pkg_type;
/

create or replace package body pkg_type
is
   function func(i1 in int, o1 out number, o2 out varchar2)
	return number
	is
	BEGIN
	    raise notice 'func(i1 in int, o1 out number, o2 out varchar2)';
		o1 := 12.34;
		o2 := 'test1';
		return 12.34;
	end;
	function func(i1 in int, i2 in int, o1 out number, o2 out varchar2)
	return number
	is
	begin 
	    raise notice 'func(i1 in int, i2 in int, o1 out number, o2 out varchar2)';
		o1 := 43.21;
		o2 := 'test2';
		return 43.21;
	end;
end pkg_type;
/

DECLARE
ii1 int := -1;
ii2 int := -1;
oo1 number := -1;
oo2 varchar2 := '';
rr1 number := -1;
begin
    rr1 := pkg_type.func(ii1, ii2, oo1, oo2);
	raise notice 'pkg_type ii1:%', ii1;
	raise notice 'pkg_type ii2:%', ii2;
	raise notice 'pkg_type oo1:%', oo1;
	raise notice 'pkg_type oo2:%', oo2;
	raise notice 'pkg_type rr1:%', rr1;
END;
/

DECLARE
ii1 int := -1;
ii2 int := -1;
oo1 number := -1;
oo2 varchar2 := '';
rr1 number := -1;
begin
    rr1 := pkg_type.func(ii1, oo1, oo2);
	raise notice 'pkg_type ii1:%', ii1;
	raise notice 'pkg_type ii2:%', ii2;
	raise notice 'pkg_type oo1:%', oo1;
	raise notice 'pkg_type oo2:%', oo2;
	raise notice 'pkg_type rr1:%', rr1;
END;
/
drop package pkg_type;

-- 1 private
create or replace package pkg_type as 
function func(a varchar2) return varchar2;
end pkg_type;
/
create or replace package body pkg_type as 
function func(a varchar2) return varchar2
as
b varchar2(5) :='var';
BEGIN
return b;
end;
function func(a integer) return integer
as
b integer := 2;
BEGIN
return b;
end;
end pkg_type;
/
select pkg_type.func(1);
drop package pkg_type;

-- test overload
create or replace package pkg_type is 
   function func(a int) return int;
   function func(a int, b out int) return int;
end pkg_type;
/
create or replace package body pkg_type
is
    function func(a int)
	return int
	is
	BEGIN
	    raise notice 'func(a int)';
		return 1;
	end;
	function func(a int, b out int)
	return int
	is
	begin 
	    b := 1;
		raise notice 'func(a int, b out int)';
		return 2;
	end;
end pkg_type;
/

DECLARE
a int := -1;
b int := -1;
c int := -1;
begin
    c := pkg_type.func(a);
	raise notice 'pkg_type a:%', a;
	raise notice 'pkg_type b:%', b;
	raise notice 'pkg_type c:%', c;
END;
/

DECLARE
a int := -1;
b int := -1;
c int := -1;
begin
    c := pkg_type.func(a, b);
	raise notice 'pkg_type a:%', a;
	raise notice 'pkg_type b:%', b;
	raise notice 'pkg_type c:%', c;
END;
/
drop package pkg_type;


-- test overload with out
create or replace package pkg_type is 
   function func(a out int) return int;
   function func(a int, b out int) return int;
end pkg_type;
/

create or replace package body pkg_type
is
    function func(a out int)
	return int
	is
	BEGIN
	    raise notice 'func(a out int)';
		a := 1;
		return 2;
	end;
	function func(a int, b out int)
	return int
	is
	begin 
		raise notice 'func(a int, b out int)';
	    b := 1;
		return 3;
	end;
end pkg_type;
/

DECLARE
a int := -1;
b int := -1;
c int := -1;
begin
    c := pkg_type.func(a, b);
	raise notice 'pkg_type a:%', a;
	raise notice 'pkg_type b:%', b;
	raise notice 'pkg_type c:%', c;
END;
/

DECLARE
a int := -1;
b int := -1;
c int := -1;
begin
    c := pkg_type.func(a);
	raise notice 'pkg_type a:%', a;
	raise notice 'pkg_type b:%', b;
	raise notice 'pkg_type c:%', c;
END;
/
drop package pkg_type;


create or replace package pkg_type is 
   function func(a int, b out int) return int;
   function func2(a int, b out int) return int;
end pkg_type;
/
create or replace package body pkg_type
is
    function func(a int, b out int)
	return int
	is
	BEGIN
	    b := 1;
	    raise notice 'func(a int, b out int)';
		return 1;
	end;
	function func2(a int, b out int)
	return int
	is
	begin 
	    b := 2;
		raise notice 'func2(a int, b out int): b:%', b;
		func(a, b);
		raise notice 'func2(a int, b out int): b:%', b;
		return 2;
	end;
end pkg_type;
/

DECLARE
a int := -1;
b int := -1;
c int := -1;
begin
    c := pkg_type.func2(a, b);
	raise notice 'pkg_type a:%', a;
	raise notice 'pkg_type b:%', b;
	raise notice 'pkg_type c:%', c;
END;
/

drop package pkg_type;

CREATE OR REPLACE PACKAGE pac_test_1 AS
FUNCTION f_test_1(para1 in out int, para2 in out int, para3 in out int) RETURN int;
END pac_test_1;
/

CREATE OR REPLACE PACKAGE BODY pac_test_1 AS
FUNCTION f_test_1(para1 in out int, para2 in out int, para3 in out int)
RETURN int IS
BEGIN
RETURN 1;
END;
END pac_test_1;
/

create table t1(c1 int,c2 text) with (ORIENTATION=COLUMN);;
insert into t1 select a,a || 'test' from generate_series(1,10) as a;

create view v1 as select c1,c2,pac_test_1.f_test_1(c1,c1,c1) from t1;
select * from v1;

drop view v1;
drop package pac_test_1;
drop table t1;


--clean
reset behavior_compat_options;

drop schema out_param_func_overload cascade;
