我有点困惑。谁能告诉我为什么这不会编译?
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 - "绑定变量不存在"
答案 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
必须在动态字符串中并使用绑定变量,因为BEGIN
和END;
你正在做动态 PL / SQL 强>
对于您的用例,我建议使用第一个选项,执行动态 SQL ,并在语句字符串后放置INTO
。