The following pl/sql function is used to fetch default values from a table 'TESTER' and return only one NOT NULL value from all 3 different default data types.
CREATE OR REPLACE TYPE mdvs AS OBJECT
(
l_default_number NUMBER,
l_default_text VARCHAR2(200),
l_default_date DATE
);
CREATE OR REPLACE FUNCTION DEF_VALUE (f_table_name IN VARCHAR2,f_column_name IN VARCHAR2)
RETURN v_mdvs
IS
obj_mdvs v_mdvs:=mdvs(0,NULL,NULL);
BEGIN
SELECT Def_NUMBER_Value,Def_TEXT_Value,Def_DATE_Value
INTO obj_mdvs.*,obj_mdvs.*,obj_mdvs.*
FROM TESTER
WHERE Table_Name=f_table_Name
AND Column_Name=f_column_Name;
IF (l_default_number != 0 ) THEN
obj_mdvs := mdvs(l_default_number);
ELSIF (l_default_text IS NOT NULL) THEN
obj_mdvs := mdvs(l_default_text);
ELSIF (l_default_date IS NOT NULL) THEN
obj_mdvs := mdvs(l_default_date);
ELSE
obj_mdvs :=mdvs('NULL');
END IF;
RETURN obj_mdvs;
END;
o/p: Type MDVS compiled
LINE/COL ERROR 6/1 PL/SQL: SQL Statement ignored 7/5 PL/SQL: ORA-00911: invalid character Errors: check compiler log
not sure how to handle this error.
EDIT:i am facing error in the below code as well . error is mentioned below :
create or replace function defaulttest
( f_table_name in varchar2
, f_column_name in varchar2 )
return mdva
is
obj_mdva mdva;
begin
begin
select mdva(defaultnumber), mdva(defaulttext), mdva(defaultdate)
into obj_mdva
from tester
where tablename = f_table_name
and columnname = f_column_name;
exception
when no_data_found then null;
end;
return
case
when obj_mdva.default_number is not null then
mdva(obj_mdva.default_number)
when obj_mdva.default_text is not null then
mdva(obj_mdva.default_text)
when obj_mdva.default_date is not null then
mdva(obj_mdva.default_date)
else
mdva(null)
end;
end defaulttest;
error: PL/SQL: SQL Statement ignored PL/SQL: ORA-00947: not enough values PL/SQL: Statement ignored PLS-00307: too many declarations of 'MDVA' match this call
code : create or replace type mdva FORCE as object ( default_number number , default_text varchar2(200) , default_date date , constructor function mdva (num number) return self as result , constructor function mdva (txt varchar2) return self as result , constructor function mdva (dt date) return self as result ); /
create or replace type body mdva as
constructor function mdva (num number) return self as result
is
begin
self.default_number := num;
return;
end;
constructor function mdva (txt varchar2) return self as result
is
begin
self.default_text:= txt;
return;
end;
constructor function mdva (dt date) return self as result
is
begin
self.default_date := dt;
return;
end;
end;
create or replace function defaulttest
( f_table_name in varchar2
, f_column_name in varchar2 )
return mdva
is
obj_mdva_number mdva;
obj_mdva_text mdva;
obj_mdva_date mdva;
begin
begin
select mdva(t.defaultnumber), mdva(t.defaulttext), mdva(t.defaultdate)
into obj_mdva_number, obj_mdva_text, obj_mdva_date
from tester t
where tablename = f_table_name
and columnname = f_column_name;
exception
when no_data_found then null;
end;
return coalesce(mdva_number, mdva.text, obj_mdva_date);
end defaulttest;
select defaulttest('table','field') from dual;
o/p: Defaulttest('table','field') SDPSGT.MDVA(4, NULL, NULL)
SQLQUERY: SELECT CASE WHEN DEFAULTNUMBER IS NOT NULL THEN TO_CHAR(DEFAULTNUMBER) WHEN DEFAULTDATE IS NOT NULL THEN TO_CHAR(DEFAULTDATE, 'YYYY-MM-DD') ELSE DEFAULTTEXT END AS COLUMNVALUE FROM TESTER WHERE tablename= 'table and columnname ='field'
mdvs
ormdva
? Are the columns of thetester
tabledef_number_value
,def_text_value
anddef_date_value
as in your original question or have they now changed todefaultnumber
,defaulttext
anddefaultdate
? – William Robertsonobj_mdva
. If you want to do it that way, you'll need to declare three of them and add them to theselect into
. – William Robertson