2014-12-04 89 views
0

我在执行存储过程时遇到错误而困惑不解。该错误是“无效的关系运算符”:为什么执行立即命令时出现运行时错误

... 
    DECLARE 
    varResult integer; 
    varFilterString varchar2(1000); 
    varSampleCode nvarchar2(80); 

    begin 
    --debug values 
    varFilterString := 'auditflag=0' ; 
    varSampleCode := 's00083'; 


--this command gives the runtime error: 
    execute immediate 'select count(*) from samples where samplecode = :samplecode and auditflag = 0 and :filter' 
    into varResult 
    using varSampleCode, varFilterString ; 
    ... 

PL/SQL是不是我经常做的,我是被它迷惑。这条线有什么问题?

TIA

回答

0

它不喜欢的:过滤器,你不能在一个完整的条件作为字符串传递,你只能通过绑定到参数。要解决你只需要直接附加字符串,而不是作为参数传递它。

execute immediate 'select count(*) from samples where samplecode = :samplecode and auditflag = 0 and ' || REPLACE(varFilterString, '''', '''''') 
into varResult 
using varSampleCode; 
+0

好了,现在,有了理解 - 但我仍然得到一个运行时错误(ORA-0900无效的SQL语句)当行执行:1和auditflag:从样品,其中samplecode =执行即时“SELECT COUNT(*) = 0和'|| varFilterString into varResult using varSampleCode; – 2014-12-04 09:29:25

+0

如果您手动运行查询,会发生什么情况:'sample sample ='s00083'且auditflag = 0且auditflag = 0'的样本中选择count(*)?我看不到明显的错误,但我现在没有Oracle。 – DoctorMick 2014-12-04 09:46:16

+0

没关系。当我得到错误时,varFilter的实际值是“submittercode ='S'”,它由调用应用程序传递并且非常合法。这可能与嵌入的撇号有关吗? – 2014-12-04 09:54:35