Oracle查询无法编译

时间:2015-02-05 12:24:43

标签: oracle plsql

我有点困惑。谁能告诉我为什么这不会编译?

declare
varSampleCode varchar2(80);
varResult integer;

varFilterString varchar2(80);

begin

varSampleCode := 'sam001';
varFilterString := 'somecolumn=2'; 

execute immediate  'select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode  and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end  into :varResult from DUAL'
using IN varSampleCode, OUT varResult;

端;

假设所有变量都已声明,并且查询本身也有意义。我收到此错误报告: 错误报告: ORA-01006:绑定变量不存在 ORA-06512:第12行 01006. 00000 - "绑定变量不存在"

1 个答案:

答案 0 :(得分:2)

我认为问题在于您在EXECUTE IMMEDIATE中尝试的动态语句是SQL语句,而不是PL / SQL语句。 INTO不是SQL,而是PL / SQL。

您可以只使用一个绑定变量执行动态 SQL 语句,然后将INTO置于动态语句之外。执行动态 SQL 语句时支持此功能:

execute immediate  'select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode  and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end from DUAL'
into varResult 
using IN varSampleCode;

或者您可以执行动态 PL / SQL 匿名阻止:

execute immediate  'begin select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode  and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end into :varresult from DUAL; end;'
using IN varSampleCode, OUT varResult;

这次INTO必须在动态字符串中并使用绑定变量,因为BEGINEND;你正在做动态 PL / SQL

对于您的用例,我建议使用第一个选项,执行动态 SQL ,并在语句字符串后放置INTO