我想找出一个问题的解决方案,其中并发程序从自由文本字段参数传递多个值。我们在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;
/
提前感谢您的反馈。