Oracle - 函数中的 Null 或 Blank 参数值
Oracle - Null or Blank parameter value in function
我正在尝试从进行查询、处理字段和 returncollection.
的函数中获取结果
如果我对函数进行查询并单独执行,return大约需要 10 分钟,具体取决于我输入的参数。如果我将相同的参数传递给函数,它会继续处理,45 分钟后我无法得到任何结果。
在查询之后,我只有几个 if 用于检查零值或高于其他值的值。
我认为问题是我传递了一些 null 或空白的参数,这导致查询崩溃。这是我的问题:
我有一个类型:
CREATE OR REPLACE TYPE TypeForFunction is OBJECT (
-- all my fields here
)
/
然后做一个 collection:
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));
无论如何我得到了相同的结果,功能不会 return 或在 45 分钟后给出任何错误。
有没有更好的方法来处理我可能会或可能不会传递值的参数?
我无法使查询更快。原来这个查询已经优化了一段时间,它 returns 下一季生产的赌注,基于我工作的公司的上一季(这是巴西的一家女装工厂),所以它很重.
但后来我编写了一个程序来进行三个简单的更新,但我遇到了同样的问题,它一直挂起并且没有给我该程序的任何结果 运行,但是单独运行的更新查询有效很好。
我开始搜索并找到了这个答案:
Stored procedure hangs seemingly without explanation
这是一个 SQL 服务器 anwser,但后来我开始搜索这个问题是否也影响 Oracle,我遇到了这个 post:
所以我在我的函数和过程中都声明了局部变量,并且这个变量接收了参数。
现在我的函数如下所示:
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 wich one I pass.
P in varchar2,
BLOQ in varchar2 -- Same null or blank here
) RETURN TypeForFunctionTable
IS
result_table TypeForFunctionTable;
i integer := 0;
LOCAL_COL varchar2(4) := COL;
LOCAL_REF varchar2(15) := REF;
LOCAL_P varchar2(6) := P;
LOCAL_BLOQ varchar2(1) :=;
而且我在所有查询中都使用了 "LOCAL" 变量并且效果很好。解决了问题。由于我的名声,我无法感谢对原版 post 发表评论的人,但我非常感谢。
也谢谢大家的回复!
我正在尝试从进行查询、处理字段和 returncollection.
的函数中获取结果如果我对函数进行查询并单独执行,return大约需要 10 分钟,具体取决于我输入的参数。如果我将相同的参数传递给函数,它会继续处理,45 分钟后我无法得到任何结果。
在查询之后,我只有几个 if 用于检查零值或高于其他值的值。
我认为问题是我传递了一些 null 或空白的参数,这导致查询崩溃。这是我的问题:
我有一个类型:
CREATE OR REPLACE TYPE TypeForFunction is OBJECT (
-- all my fields here
)
/
然后做一个 collection:
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));
无论如何我得到了相同的结果,功能不会 return 或在 45 分钟后给出任何错误。
有没有更好的方法来处理我可能会或可能不会传递值的参数?
我无法使查询更快。原来这个查询已经优化了一段时间,它 returns 下一季生产的赌注,基于我工作的公司的上一季(这是巴西的一家女装工厂),所以它很重.
但后来我编写了一个程序来进行三个简单的更新,但我遇到了同样的问题,它一直挂起并且没有给我该程序的任何结果 运行,但是单独运行的更新查询有效很好。
我开始搜索并找到了这个答案:
Stored procedure hangs seemingly without explanation
这是一个 SQL 服务器 anwser,但后来我开始搜索这个问题是否也影响 Oracle,我遇到了这个 post:
所以我在我的函数和过程中都声明了局部变量,并且这个变量接收了参数。
现在我的函数如下所示:
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 wich one I pass.
P in varchar2,
BLOQ in varchar2 -- Same null or blank here
) RETURN TypeForFunctionTable
IS
result_table TypeForFunctionTable;
i integer := 0;
LOCAL_COL varchar2(4) := COL;
LOCAL_REF varchar2(15) := REF;
LOCAL_P varchar2(6) := P;
LOCAL_BLOQ varchar2(1) :=;
而且我在所有查询中都使用了 "LOCAL" 变量并且效果很好。解决了问题。由于我的名声,我无法感谢对原版 post 发表评论的人,但我非常感谢。
也谢谢大家的回复!