varchar2 vs char not different enough
declare
procedure proc1 (
n in varchar2
) is
begin
DBMS_OUTPUT.PUT_LINE('varchar2 version');
end;
procedure proc1 (
n in char
) is
begin
DBMS_OUTPUT.PUT_LINE('char version');
end;
begin
proc1(1.1);
proc1(1);
end;
ORA-06550: line 16, column 4: PLS-00307: too many declarations of 'PROC1' match this callMore Details: https://docs.oracle.com/error-help/db/ora-06550
Automatic determination of number vs pls_integer
declare
plsi pls_integer := 2**30;
procedure proc1 (
n in pls_integer
) is
begin
DBMS_OUTPUT.PUT_LINE('pls_integer version');
end;
procedure proc1 (
n in number
) is
begin
DBMS_OUTPUT.PUT_LINE('number version');
end;
begin
proc1(1.1);
proc1(1);
proc1(plsi);
proc1(2147483647); -- 2**31 - 1
proc1(2147483648); -- 2**31
proc1(2**1);
end;
Statement processed.
number version
pls_integer version
pls_integer version
pls_integer version
number version
number version
Package for next demonstration
create or replace package ol is
function run_stuff (
p_n in pls_integer
) return varchar2;
function run_stuff (
p_n in integer
) return varchar2;
end;
Package created.
Package for next demonstration
create or replace package body ol is
function run_stuff (
p_n in pls_integer
) return varchar2 is
begin
return 'pls_integer-' || p_n;
end;
function run_stuff (
p_n in integer
) return varchar2 is
begin
return 'integer-' || p_n;
end;
end;
Package Body created.
Dynamic SQL chooses the SQL type
declare
l_value1 pls_integer := 1;
l_value2 pls_integer := 1;
begin
execute immediate 'BEGIN
DBMS_OUTPUT.PUT_LINE (ol.run_stuff (:value1));
END;'
using l_value1;
execute immediate 'BEGIN
DBMS_OUTPUT.PUT_LINE (ol.run_stuff ('|| l_value1 || '));
END;';
dbms_output.put_line(ol.run_stuff(l_value1));
end;
Statement processed.
integer-1
pls_integer-1
pls_integer-1