Oracle 在“IN”where子句上传递多个值
我想找出一个解决方案,解决并发程序从自由文本字段参数传入多个值的问题。我们使用的是RDBMS:11.2.0.3.0和Oracle应用程序:12.1.3。并发程序调用自定义plsql过程,该过程根据传入的参数生成XML输出。我尝试动态创建where子句,以使sys\u refcursor工作,如下所示。我还尝试了regexp_substr,以便在传入参数字符串后基本上创建一个值列表,但它也不起作用。我尝试过的一切都失败了,错误如下。有人可以看一看,让我知道我如何才能使这项工作 这是我收到的错误:PL/SQL:数值或值错误:指定的LOB定位器无效:ORA-22275 下面是一个问题的例子Oracle 在“IN”where子句上传递多个值,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我想找出一个解决方案,解决并发程序从自由文本字段参数传入多个值的问题。我们使用的是RDBMS:11.2.0.3.0和Oracle应用程序:12.1.3。并发程序调用自定义plsql过程,该过程根据传入的参数生成XML输出。我尝试动态创建where子句,以使sys\u refcursor工作,如下所示。我还尝试了regexp_substr,以便在传入参数字符串后基本上创建一个值列表,但它也不起作用。我尝试过的一切都失败了,错误如下。有人可以看一看,让我知道我如何才能使这项工作 这是我收到的错误:P
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;
/
提前感谢您的反馈。请提供异常的错误回溯。。。以便识别发生异常的行。可以通过将dbms_utility.format_error_backtrace的结果记录在过程的异常处理程序中的某个位置来完成此操作。对于初学者,请删除dbms_lob.createtemporaryxmldoc,TRUE;。您对dbms_xmlgen.getxmlctx的调用;自动为您创建临时CLOB;再试一次,我也犯了同样的错误。这是dbms_实用程序.format_error_backtrace retruns:ORA-06512:atsys.dbms_LOB,第818行。另外,正如我在SQLERRM返回之前所述:进程失败,出现以下错误:ORA-06502:PL/SQL:数值或值错误:指定的LOB定位器无效:ORA-22275第四个问题是,代码中有多个位置可能会在指定无效LOB定位器时失败。除非您准确地确定哪一行引发了异常,否则我无法帮助您。完全删除/注释掉异常处理程序,并发布到您的问题,而不是下面的注释!使用编辑链接查看PLSQL代码执行的完整异常堆栈。是否无响应?如果没有适当的远程协作,就无法进行远程性能调整。