How about the following for Oracle... I can also send it as an attachment.
Regards, Sven Boden EDS create table category ( categoryid char(2), name varchar(255), title varchar(255), description varchar(255), sequence number ); insert into category(categoryid, name, title, description, sequence) values('AA', 'AA name', 'Title AA', 'Description AA', 1); insert into category(categoryid, name, title, description, sequence) values('AA', 'AB name', 'Title AB', 'Description AB', 1); insert into category(categoryid, name, title, description, sequence) values('BB', 'AA name', 'Title BB', 'Description BB', 1); insert into category(categoryid, name, title, description, sequence) values('CC', 'CC name', 'Title CC', 'Description CC', 1); insert into category(categoryid, name, title, description, sequence) values('AA', 'DD name', 'Title DD', 'Description DD', 1); / create or replace package category_pkg as type ref_cursor is ref cursor; function get_category(categoryid varchar default null, name category.name%type default null) return ref_cursor; end; / create or replace package body category_pkg as function get_category(categoryid varchar default null, name category.name%TYPE default null) return ref_cursor is return_cursor ref_cursor; sqltext varchar(4000); first char(1) default 'Y'; begin -- -- Note that this is a very bad example of Oracle PL-SQL code -- Any query should use parameter binding to be scalable and -- to avoid 'SQL injection'. -- sqltext := 'select c.categoryid, c.title, c.description, c.sequence ' || ' from category c '; if ( categoryid is not null ) then if ( first = 'Y' ) then sqltext := sqltext || 'where c.categoryid in (' || categoryid || ') '; first := 'N'; end if; end if; if ( name is not null ) then if ( first = 'Y' ) then sqltext := sqltext || 'where '; else sqltext := sqltext || 'and '; end if; sqltext := sqltext || 'c.name like ''' || name || '%''' ; first := 'N'; end if; open return_cursor for sqltext; return return_cursor; end get_category; end; / -- Examples of execution via SQL-plus set autoprint on declare c category_pkg.ref_cursor; begin -- :c := category_pkg.get_category(); -- :c := category_pkg.get_category(name => 'AB'); -- :c := category_pkg.get_category(name => 'AA', categoryid => '''AA'', ''BB'''); :c := category_pkg.get_category(categoryid => '''AA'', ''BB'''); end;