Я пытаюсь получить результат от функции, которая делает запрос, обрабатывает поля и возвращает коллекцию.
Если я возьму запрос функции и выполню отдельно, она вернется примерно через 10 минут, в зависимости от параметров, которые я поставил. Если я передам функции те же параметры, она продолжит обработку, и через 45 минут я не получу никакого результата.
После запроса у меня есть только несколько if, которые проверяют нулевые значения или значения, которые выше, чем другие.
Я думаю, проблема в том, что я передаю некоторые параметры нулевыми или пустыми, и это приводит к сбою запроса. Вот моя проблема:
У меня есть тип:
CREATE OR REPLACE TYPE TypeForFunction is OBJECT (
-- all my fields here
)
/
Затем сделайте коллекцию:
CREATE OR REPLACE TYPE TypeForFunctionTable AS
TABLE OF TypeForFunction
/
Тогда моя функция выглядит так:
CREATE OR REPLACE FUNCTION MyFunction
(
/* here I have five parameters and in the case that the query crashes,
two of them I'm trying to pass blank or null */
COL in varchar2, -- This I pass a valid value
INDEX in number, -- same here
REF in varchar2, -- This one I'm trying to pass Blank ('') or Null and i
get no result no matter which one I pass.
P in varchar2,
BLOQ in varchar2 -- Same null or blank here
) RETURN TypeForFunctionTable
IS
result_table TypeForFunctionTable;
i integer := 0;
begin
select
TypeForFunction(
/* Here I have some subquerys that I use the parameters null which
I use the same way as parameter REF. Like: */
and (MyTable.FieldP = P or P is null)
and (MyTable.FielBloq = BLOQ or BLOQ is null)
) BULK COLLECT into result_table
from
myTables
where
-- here I have a clause like
(MyTable.FieldREF = REF or REF is null)
;
For i in 1..result_table.count loop
/* Here I have some if's, but nothing to crash the query like it happens.
Things like: */
if MyVar > 0 then
COL = REF;
INDEX = INDEX + 100;
end loop;
return result_table;
end MyFunction;
/
Чтобы вызвать функцию, которую я пытаюсь:
select * from table(MyFunction('59', 1, '', 'IV18', ''));
Также попробуйте:
select * from table(MyFunction('59', 1, Null, 'IV18', Null));
В любом случае я получаю тот же результат, функция не возвращается и не выдает никаких ошибок через 45 минут.
Есть ли лучший способ работать с параметрами, которые я могу передавать или не передавать?
null
против''
к вопросу. Нет никакой разницы дляvarchar2
параметров, которые есть у вашей функции. В чем именно вопрос? - person William Robertson   schedule 19.06.2018