【发布时间】:2017-02-03 13:09:04
【问题描述】:
我有一个从 Json 结构中获取可选参数的存储过程。如果提供了 json 值,则参数将用作游标的条件。如果没有提供 json 值,我不想要那个条件。 我已经通过在 sql 条件下使用 Coalesce/Nvl 解决了这个问题。问题是该过程使用 Nvl/Coalesce 运行了很长时间。我可以使用其他更有效的方法吗?也许是动态sql?
我的程序:
Create or Replace Procedure findaccounts
(jsonIn IN clob,
jsonOut OUT varchar2)
As
obj json := json(jsonIn);
json_obj_out json;
json_lst json_list := json_list();
--Getstring is a function that sets variable to null if json value is not found
istatus varchar2(10) := GetString(obj json, 'status');
icreatedate := GetString(obj json, 'daysold');
iage int := GetString(obj json, 'age');
irownum int := GetString(obj json, 'rownum');
Begin
For rec in (Select A.accountnumber
From Accounts A
Inner Join Accountowner Ao On A.ownerId = Ao.Id
Where A.Status = iStatus
And A.daysold >= Coalesce(idaysold,A.daysold)
And Ao.Age = Coalesce(iAge,Ao.Age)
And rownum <= Coalesce(iRownum,5))
loop
obj := json();
obj.put('accountnumber',Rec.accountnumber);
json_lst.append(obj.to_json_value);
end loop;
json_lst.print;
jsonOut := json_lst.to_char();
End;
已解决:
使用动态 sql 提升性能。具有动态绑定变量的选项已通过 dbms_sql 包解决,因为立即执行没有此选项。
【问题讨论】: