2016-12-21 4 views
0

Я ищу способ вернуть один нечувствительный к регистру 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 является использование в верхнем регистре версии второй параметр ... и из-за этого есть огромный беспорядок: я получаю имя столбца из таблицы в col, из cols, а затем я пытаюсь сделать курсор, который идет вокруг проверки того, что кортеж, идущий по тем же самым изменениям , является первым параметром, или нет, если это произойдет, тогда он должен вернуть неизмененную версию той, что находится в таблице. В противном случае он должен возвращать значение «null», которое я буду обрабатывать по-разному в каждой процедуре, которая его использует. Путем null я имею в виду ничего, а не строку.

+0

Ваш вопрос широко неопровержимый. Вам нужно отредактировать его, чтобы объяснить, что вы хотите, если вы ожидаете от нас помощи. Всегда рекомендуется размещать некоторые выборочные данные и желаемый результат. – APC

ответ

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; 
Смежные вопросы