简体   繁体   中英

How to create a function that returns a query based on user input in PL/SQL?

I am a beginner at PL/SQL and trying to learn how to write functions with input parameters and return values. However, I am having a hard time finding any information on how to return multiple table rows in a function.

I want to create a function that allows the user to input a string, and then my function will return a query with a where clause based on the input.

For example,

the user can enter the input "January" when calling my function.

Then, when my function is running, I want to basically do:

return select * from DataTable where month = "January"

Is there any way to do this simply in PL/SQL? I would really appreciate the help!

I assume you want your function to return an actual query, not the result of running the query. In that case you are looking for a function that returns a string. In this case a simple string (varchar2) replacement. Try: (see demo )

create or replace function get_month_query( month_name_in varchar2) 
  return varchar2 
is
    k_base_query constant varchar2(60) := 
        'select * from datatable where month = ''parm_month'''; 
begin    
    return (replace( k_base_query, 'parm_month', month_name_in) ); 
end get_month_query; 

Note: There are many other ways to accomplish this, it is just my style.

You can try:

CREATE OR REPLACE FUNCTION compose_query(p_month VARCHAR2)
  RETURN VARCHAR2
IS
 l_month DATE;
BEGIN
  BEGIN
    SELECT to_date(p_month,'Month')
      INTO l_month
      FROM dual;
  EXCEPTION WHEN OTHERS  
    THEN 
      RETURN 'ERROR';
  END;
  RETURN 'select * from datatable where month = '||''''||p_month||''';';
END;

not a great idea in general, but a small insurance at least.

Hope this helps:

-for this table:

create table datatable (ID number, month date);

-u need to create these 2 types:

create or replace type o_type as object (a number, b date);
create or replace type t_type is table of o_type;

-and here is the function:

create or replace function f_function (p_month in varchar2)
return t_type PIPELINED is
v_month date:=to_date(p_month,'Month');
begin
    for i in (select * from DataTable where month=v_month) loop
        pipe row (o_type(i.id,i.month));
        end loop;
        RETURN;
end;

test:

insert into datatable values(1,to_date('January','Month'));
insert into datatable values(2,to_date('January','Month'));
insert into datatable values(3,to_date('January','Month'));
insert into datatable values(4,to_date('October','Month'));
insert into datatable values(5,to_date('July','Month'));


select * from table(f_function('January'));

Result:

1   01.01.2022
2   01.01.2022
3   01.01.2022

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM