问题描述
嗨,团队,
我需要一些帮助来提高性能
我有一个XML,如下所示,该XML将被输入到我的PL/SQL函数中
<?xml version = "1.0" encoding = "UTF-8"?>
1000
1001
1002
我的表如下
员工编号 (varchar2 (20))
PID (数字 (10))
Xml _ 员工详细信息 (XMLTYPE)
我的PL/SQL函数如下
创建或替换功能
员工 (CLOB中的xml)
返回号码
是
PRAGMA自主交易;
V_PID VARCHAR2(300);
V_MAINQUERY clob;
主游标SYS_REFCURSOR;
V_PIDCUR varchar2(30);
xml_details CLOB;
sqlErr varchar2(200);
开始
V_MAINQUERY:= '(从IMPP.EMPLOYEE A中选择PID,其中A.EMPLOYEE编号在 (SELECT EMPLOYEENUMBER
FROM XMLTABLE (xmlnamespaces(
''urn:global:cs:common'' AS "tns0")
, ''/tns0:Request'' PASSING
XMLType('|| in_XML||') COLUMNS baselist XMLTYPE PATH
''tns0:Conditions'') t1,
XMLTABLE (xmlnamespaces(
''urn:global:cs:common'' AS "tns0")
,
''tns0:Conditions/tns0:Numbers/tns0:Number''
PASSING t1.baselist COLUMNS
EMPLOYEENUMBER VARCHAR2(88) PATH
''text()'') xmlT) ';
为V_MAINQUERY打开主游标;
循环
将主光标提取到V_PIDCUR中;
当主游标 % 未找到时退出;
开始
选择一个.PID,一个.MSG_EMPDETAILSDETAILS.getClobVal()
进入v_PID,来自impp.EMPLOYEE a的xml_EmployeeDetails,其中A.EMPLOYEEPID = ''| | V_PIDCUR | |'';
当其他人则例外
Raise_application_error (-20002,“在StudyDetails中发生了错误。” | | SQLERRM);
结束;
返回0;
END 循环;
返回0;
异常
当其他人那么
sqlErr := substr(sqlerrm,1,100);
结束;
我用粗体引号的内容可以用逗号分隔的员工编号列表替换,但是像这样,我不能有超过1000条记录。如果我使用上述的子查询,它会增加执行时间。
我需要一些帮助来提高性能
我有一个XML,如下所示,该XML将被输入到我的PL/SQL函数中
<?xml version = "1.0" encoding = "UTF-8"?>
我的表如下
员工编号 (varchar2 (20))
PID (数字 (10))
Xml _ 员工详细信息 (XMLTYPE)
我的PL/SQL函数如下
创建或替换功能
员工 (CLOB中的xml)
返回号码
是
PRAGMA自主交易;
V_PID VARCHAR2(300);
V_MAINQUERY clob;
主游标SYS_REFCURSOR;
V_PIDCUR varchar2(30);
xml_details CLOB;
sqlErr varchar2(200);
开始
V_MAINQUERY:= '(从IMPP.EMPLOYEE A中选择PID,其中A.EMPLOYEE编号在 (SELECT EMPLOYEENUMBER
FROM XMLTABLE (xmlnamespaces(
''urn:global:cs:common'' AS "tns0")
, ''/tns0:Request'' PASSING
XMLType('|| in_XML||') COLUMNS baselist XMLTYPE PATH
''tns0:Conditions'') t1,
XMLTABLE (xmlnamespaces(
''urn:global:cs:common'' AS "tns0")
,
''tns0:Conditions/tns0:Numbers/tns0:Number''
PASSING t1.baselist COLUMNS
EMPLOYEENUMBER VARCHAR2(88) PATH
''text()'') xmlT) ';
为V_MAINQUERY打开主游标;
循环
将主光标提取到V_PIDCUR中;
当主游标 % 未找到时退出;
开始
选择一个.PID,一个.MSG_EMPDETAILSDETAILS.getClobVal()
进入v_PID,来自impp.EMPLOYEE a的xml_EmployeeDetails,其中A.EMPLOYEEPID = ''| | V_PIDCUR | |'';
当其他人则例外
Raise_application_error (-20002,“在StudyDetails中发生了错误。” | | SQLERRM);
结束;
返回0;
END 循环;
返回0;
异常
当其他人那么
sqlErr := substr(sqlerrm,1,100);
结束;
我用粗体引号的内容可以用逗号分隔的员工编号列表替换,但是像这样,我不能有超过1000条记录。如果我使用上述的子查询,它会增加执行时间。
专家解答
看起来很多动态SQL和逐行处理的原因不多?
这一切可以简化为一个简单的:
这一切可以简化为一个简单的:
for i in (
SELECT A.PID,A.MSG_EMPDETAILSDETAILS.getClobVal()
FROM IMPP.EMPLOYEE A
WHERE A.EMPLOYEENUMBER IN
(
SELECT EMPLOYEENUMBER
FROM XMLTABLE (xmlnamespaces('urn:global:cs:common' AS "tns0"),
'/tns0:Request' PASSING XMLType(in_xml)
COLUMNS baselist XMLTYPE PATH 'tns0:Conditions') t1,
XMLTABLE (xmlnamespaces('urn:global:cs:common' AS "tns0"),
'tns0:Conditions/tns0:Numbers/tns0:Number'
PASSING t1.baselist
COLUMNS EMPLOYEENUMBER VARCHAR2(88) PATH 'text()') xmlT
)
) loop
...
end loop;
end;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




