Есть ли способ для определить тип данных входного параметра в функции pl_sql, как у нас есть instanceof в java. Я попытался использовать функцию dump, но ее можно использовать только в запросе.Определение типа входного параметра
ответ
Из комментариев кажется, что вы хотите построить динамическую строку запроса, перейдя по входным параметрам, предположительно, чтобы создать предложение 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, поскольку привязка позаботится об этом в любом случае.
- 1. Обеспечение типа входного параметра
- 2. Передача NULL для входного параметра типа перечисление -
- 3. Определение параметра ограниченного типового типа в C#
- 4. Определение общего типа информации с помощью параметра
- 5. Определение параметра в виде неопределенного типа шаблона
- 6. Java формальное определение типа параметра (дженериков)
- 7. Ограничение общего входного параметра
- 8. Определение типа
- 9. Типа дата и время для входного параметра в процедуре
- 10. Определение типа анонимного типа
- 11. Поиск «типа» входного элемента
- 12. UI типа входного файла
- 13. Стиль входного типа = номер
- 14. Определение типа для параметра общего метода во время выполнения
- 15. Определение параметра обратного вызова jQuery ajax как существующего типа объекта
- 16. Определение группы: из параметра -
- 17. Тип возврата на основе значения входного параметра
- 18. Передача функционального параметра типа XMVECTOR
- 19. Функция типа параметра в определении типа
- 20. Определение типа для класса потомков
- 21. Определение типа типа для prom.reject
- 22. Определение типа типа для prom.prototype.finally
- 23. Установить по умолчанию css типа входного типа
- 24. определение типа, соответствующее boost :: bind
- 25. Определение рекурсивного типа внутри шаблона
- 26. Определение типа возвращаемого типа динамического типа
- 27. параметр типа Java против параметра
- 28. Определение типа в шаблоне функции
- 29. C++: сложное определение типа функции
- 30. innerHTML значение входного типа Form
Не уверен, что я следую ... вы объявляете тип данных в спецификации функции. Внутри функции он будет иметь такой тип данных, поэтому вы пытаетесь выяснить, какой тип был в вызове, прежде чем он, возможно, был неявно преобразован в тип входного параметра? Что именно ты пытаешься сделать? –
Я хочу написать общий приемник для всех входных параметров. например, если входным параметром является varchar2, тогда я могу вызвать getter для Varchar2. – eatSleepCode
SQL не работает так - это строго типизированный язык; вы должны определить тип данных для каждого параметра при определении функции. Я не знаю, что вы имеете в виду, но я не думаю, что это было бы особенно полезно в PL/SQL. –