2013-04-10 5 views
0

Есть ли способ для определить тип данных входного параметра в функции pl_sql, как у нас есть instanceof в java. Я попытался использовать функцию dump, но ее можно использовать только в запросе.Определение типа входного параметра

+1

Не уверен, что я следую ... вы объявляете тип данных в спецификации функции. Внутри функции он будет иметь такой тип данных, поэтому вы пытаетесь выяснить, какой тип был в вызове, прежде чем он, возможно, был неявно преобразован в тип входного параметра? Что именно ты пытаешься сделать? –

+0

Я хочу написать общий приемник для всех входных параметров. например, если входным параметром является varchar2, тогда я могу вызвать getter для Varchar2. – eatSleepCode

+0

SQL не работает так - это строго типизированный язык; вы должны определить тип данных для каждого параметра при определении функции. Я не знаю, что вы имеете в виду, но я не думаю, что это было бы особенно полезно в PL/SQL. –

ответ

0

Из комментариев кажется, что вы хотите построить динамическую строку запроса, перейдя по входным параметрам, предположительно, чтобы создать предложение where без необходимости вводить его вручную. Похоже, что это облегчит обслуживание и понимание, чтобы не принести большой пользы.

Но, как упражнение, вы можете использовать . Определите определения параметров из окна user_arguments. Проблема в том, что вы не можете получить фактический параметр значения, не назвав их, и если бы вы это сделали, тип данных был бы значительным, если бы вы непосредственно вставляли значения в динамическую строку (что вы действительно не можете сделать в loop), а не как переменные связывания, что было бы плохо в любом случае. И если вы используете переменную привязки, вам не нужно знать тип данных.

Так что для собственного удовольствия в основном, если у меня есть таблица с различными типами данных:

create table t42(col1 varchar2(10), col2 number, col3 date); 
insert into t42 values ('data', 42, trunc(sysdate)); 

... и функцию, где имена параметров совпадают с именами столбцов таблицы, то вы можете создать динамический строка с переменными связывания:

create function f42(col1 t42.col1%type, col2 t42.col2%type, 
    col3 t42.col3%type) 
return varchar2 is 
    str varchar(4000); 
    result t42.col1%type; 
    have_where boolean := false; 
begin 
    str := 'select col1 from t42'; 
    for r in (
     select argument_name, data_type 
     from user_arguments 
     where object_name = 'F42' 
     and position > 0 -- to account for return type 
     order by position 
    ) loop 
     if not have_where then 
      have_where := true; 
      str := str || ' where '; 
     else 
      str := str || ' and '; 
     end if; 
     str := str || r.argument_name || ' = :' || r.argument_name; 
    end loop; 

    dbms_output.put_line(str); 

    execute immediate str into result using col1, col2, col3; 
    return result; 
end; 
/

Что я могу затем вызвать из SQL * Plus:

SQL> var rc varchar2(10); 
SQL> exec :rc := f42('data', 42, trunc(sysdate)); 

select col1 from t42 where COL1 = :COL1 and COL2 = :COL2 and COL3 = :COL3 

PL/SQL procedure successfully completed. 

SQL> print rc 

RC 
-------------------------------- 
data 

Очевидно, очень надуманный пример, но он будет масштабироваться с большим количеством параметров, только с предложением using, чтобы перечислить их все. Я думаю. Что делает не означает, что я думаю, что это хорошая идея - просто для удовольствия ...

Вы могли бы сделать некоторые манипуляции внутри цикла в зависимости от типа данных, если вы хотите, проверяя r.data_type значение:

 str := str || r.argument_name || ' = '; 
     if r.data_type = 'DATE' then 
      str := str || 'trunc(:' || r.argument_name || ')'; 
     else 
      str := str || ':' || r.argument_name; 
     end if; 

... который вы могли бы назвать без trunc значение в вызове:

SQL> exec :rc := f42('data', 42, sysdate); 

select col1 from t42 where COL1 = :COL1 and COL2 = :COL2 and COL3 = trunc(:COL3) 

PL/SQL procedure successfully completed. 

SQL> print rc 

RC 
-------------------------------- 
data 

... но кроме этого, вам не нужно знать тип каждого столбца в динамический string, поскольку привязка позаботится об этом в любом случае.

Смежные вопросы