I discussed the execution of Oracle stored procedures via NHibernate in a previous post, and also the generation of the NHibernate .hbm.xml mapping files for Stored Procedures.![]()
We use the same cursor declaration as in my post on generating the .hbm.xml file, and also the same parameter type conversion logic:
csdatatype varchar2(50);
args varchar2(500);
begin
dbms_output.enable(1000000);
dbms_output.put_line('using System.Collections;');
dbms_output.put_line('using NHibernate;');
dbms_output.put_line('');
dbms_output.put_line('namespace MyDAL');
dbms_output.put_line('{');
dbms_output.put_line(' public static class Procedures');
dbms_output.put_line(' {');
for obj in cObjects loop
args := '';
for col in cColumns(obj.object_name) loop
csdatatype := col.data_type;
case col.data_type
when 'NVARCHAR2' then
csdatatype := 'string';
when 'VARCHAR2' then
csdatatype := 'string';
when 'CHAR' then
if col.char_length=1 then
csdatatype := 'bool';
else
csdatatype := 'string';
end if;
when 'NUMBER' then
if col.data_precision is null then
csdatatype := 'long';
elsif col.data_precision < 10 then
csdatatype := 'int';
else
csdatatype := 'long';
end if;
else
csdatatype := col.data_type;
end case;
args := args || ', ' || csdatatype || ' ' || col.argument_name;
end loop;
After concatenating the parameter list for the C# method, we create an IQuery object, add parameters using the SetParameter<>() method, and return the result as an IList:
dbms_output.put_line(' public static IList ' ||
replace(initcap(obj.object_name), '_', '')
|| '(ISession session' || args || ')');
dbms_output.put_line(' {');
dbms_output.put_line(' IQuery sp = session.GetNamedQuery("'
|| replace(initcap(obj.object_name), '_', '') || '");');
for col in cColumns(obj.object_name) loop
csdatatype := col.data_type;
case col.data_type
when 'NVARCHAR2' then
csdatatype := 'string';
when 'VARCHAR2' then
csdatatype := 'string';
when 'CHAR' then
if col.char_length=1 then
csdatatype := 'bool';
else
csdatatype := 'string';
end if;
when 'NUMBER' then
if col.data_precision is null then
csdatatype := 'long';
elsif col.data_precision < 10 then
csdatatype := 'int';
else
csdatatype := 'long';
end if;
else
csdatatype := col.data_type;
end case;
dbms_output.put_line(' sp.SetParameter<'
|| csdatatype || '>("' ||
replace(initcap(col.argument_name), '_', '') || '", ' ||
replace(initcap(col.argument_name), '_', '') || ');');
end loop;
dbms_output.put_line(' return sp.List();');
dbms_output.put_line(' }');
end loop;
dbms_output.put_line(' }');
dbms_output.put_line('}');
The IQuery object references the generated HBM declaration, and executes the PL/SQL code behind the sql-query statement
BEGIN MyStoredProc(params); END;

nice share,,, thanks