在' IN'上传递多个值where子句

时间:2014-11-12 21:14:47

标签: oracle plsql dynamic-sql

我想找出一个问题的解决方案,其中并发程序从自由文本字段参数传递多个值。我们在RDBMS:11.2.0.3.0和Oracle Applications:12.1.3。并发程序调用一个自定义的plsql过程,该过程根据传入的参数生成XML输出。我试图动态创建where子句使sys_refcursor工作如下所示。我已经尝试过regexp_substr,一旦传入参数字符串,它基本上就会创建一个值列表,但它也不起作用。我试过的一切都失败了,下面的错误。有人可以看看,让我知道如何才能使这项工作?

这是我收到的错误:PL / SQL:数字或值错误:指定了无效的LOB定位符:ORA-22275。

以下是问题的一个示例。

DECLARE
ctx dbms_xmlgen.ctxhandle;
ref_cur   sys_refcursor;
xmldoc  clob;
v_company varchar2(25);
v_major_acct varchar2(150);
v_major_acct_free varchar2(150);
l_length number;
l_offset number := 1;
l_amount number:=16383;
l_rpt_data varchar2(32767);
v_where varchar(32000);

BEGIN

dbms_lob.createtemporary(xmldoc,TRUE);
v_company := '00110';--p_company;
v_major_acct:=('310;765');--p_major_acct; -----> When I pass only one value it works but fails with two values.

IF v_major_acct IS NOT NULL
   THEN
      v_major_acct_free := '';

      SELECT   REPLACE (v_major_acct, ';', ''',''')
        INTO   v_major_acct_free
        FROM   DUAL;

      v_major_acct_free := '(''' || v_major_acct_free || ''')';

      v_where:=v_where||'and major_acct in' || v_major_acct_free;
END IF;

open ref_cur for '
select * from VIEW
WHERE company =nvl(:v_company, company)'||v_where ---v_where contains AND major_acct in ('310','765') but it fails.
using v_company;
ctx := dbms_xmlgen.newcontext(ref_cur);
xmldoc := dbms_xmlgen.getxml(ctx);
l_length := nvl(dbms_lob.getlength(xmldoc),0);
fnd_file.put_line (fnd_file.log, l_length);
    if (nvl(l_length,0) > 0) then
      loop
         exit when l_length <= 0;
         dbms_lob.read (xmldoc, l_amount, l_offset, l_rpt_data);
         fnd_file.put (fnd_file.output, l_rpt_data);
         -- dbms_output.put_line(l_rpt_data);
         l_length := l_length - l_amount;
         l_offset := l_offset + l_amount;
      end loop;
   end if;
   dbms_lob.freetemporary(xmldoc);
   close ref_cur;
   dbms_xmlgen.closecontext(ctx);

exception

   when others then
      dbms_xmlgen.closecontext(ctx);
      fnd_file.put (fnd_file.output, v_major_acct);
      --errbuf := 'Process failed with the following error: '||sqlerrm;
      --retcode := 2;
      --raise_application_error (-20000,'Process Failed'||SQLCODE||' -ERROR- '||SQLERRM);
end;
/

提前感谢您的反馈。

0 个答案:

没有答案