将表名传递给函数

时间:2016-12-21 19:23:56

标签: oracle plsql

我正在寻找一种从作为参数给出的表中返回一个不区分大小写的varchar2的方法。 数据库被配置为将第一列作为我将要查看的列。 这就是我所要做的:

create or replace function generic_return(nam varchar2, table_n varchar2)
return varchar2
as
    case_insensitive varchar2(300);
    case_ins varchar2(300);
    colu varchar2(30);
    t_nam varchar2(30):=upper(table_n);
    cursor point is execute inmediate select colu from t_nam;
    cursor col is select column_name from cols where table_name=t_nam;
    non_existent_table exception;
begin
    case_ins:=upper(rtrim(ltrim(nam)));
    open col;
    fetch col into colu;
    close col;
    select column_name from cols where table_name=upper(table_n);
    if colu is null then
        raise non_existent_table;
    end if;

    open point;
    loop
    fetch point into case_insensitive;
    exit when point%notfound;
    if upper(case_insensitive)=case_ins then
        return case_insensitive;        
    end if;
    end loop;
    close point;
    return null;
end;    
/

该函数接收要查找的内容,以及要查看的表的名称,然后第一个变量是比较它们,t_nam是使用第二个参数的大写版本......从那里&#39 ;这是一个巨大的混乱:我从cols中的表中获取列名,然后我尝试创建一个游标,检查是否有相同修改的元组是第一个参数,还是没有,如果它恰好是,那么它应该返回表中的未修改版本。否则,它应该返回" null",我会在每个使用它的过程中区别对待。 我的意思是虚无,而不是字符串。

1 个答案:

答案 0 :(得分:2)

是的,你是对的。这是一个非常大的混乱。 : - )

对于初学者,您不能将显式游标声明为执行立即语句。

接下来,如果您想要表格中的第一列,则需要指定

WHERE column_id = 1

然后你可以通过SELECT-INTO抓住它,不需要显式游标。

然后你可以试试像:

   my_cur SYS_REFCURSOR;
BEGIN
...
   OPEN my_cur FOR 'SELECT ' || first_col || ' FROM ' || t_name;
   LOOP
      FETCH my_cur INTO case_insensitive;
      EXIT WHEN my_cur%NOTFOUND;
      ... logic for match ....
   END LOOP;
   CLOSE my_cur;