我在Oracle中使用where子句条件来检查与给定值类似的名称,它返回正确的结果,但运行速度非常慢。有没有更有效的方法来执行这种情况?谢谢。
AND
(P5_ORGN_NAME IS NULL OR
(D.ORGANIZATION_NAME LIKE '' || upper(P5_ORGN_NAME) || '%' OR D.FORMATTED_ORGANIZATION_NAME like
'' || local.pkg.orgname_format(upper(P5_ORGN_NAME)) || '%')
)
答案 0 :(得分:2)
创建pkg.orgname_format
函数DETERMINISTIC
,以便Oracle知道不会为每一行反复运行它。
在local.pkg
包...
FUNCTION orgname_format (p_org_name VARCHAR2)
RETURN VARCHAR2 DETERMINISTIC IS
BEGIN
...
END;
这将告诉Oracle该函数始终为相同的输入参数值返回相同的值。知道这一点,Oracle可以执行一次该函数,而不是为查询中基础表中的每一行执行该函数。
当然,如果函数确实是确定性的,你只能使用它,听起来就是这样,从它的名字来判断。