2017-05-27 226 views
-2

我需要在使用xquery的列中输出一条消息,指出“匹配”或“不是员工”。我使用的是4444的预留位置,不知道如何通过查询XQuery选择并检查现有员工的消息

SELECT 
EXTRACTVALUE(B.JOBSHEET_DETAILS, '/jobSheet[@jobNo]/@jobNo') AS "JOB_DETAILS_ID", 
XMLQUERY(' for $j in /jobSheet/employee[@empNo]/@empNo 
     let $msg := if ($j) then "Employee details match a current employee" else "Error in employee details (no match)" 
     where $j = 4444 
     return $msg 
     ' 
     PASSING B.JOBSHEET_DETAILS 
     RETURNING CONTENT).getstringval() AS "CHECK_EMP_DETAILS" , 
EXTRACTVALUE(B.JOBSHEET_DETAILS, '/jobSheet/employee[@empNo]/@empNo') AS "EMP_NO", 
EXTRACTVALUE(B.JOBSHEET_DETAILS, '/jobSheet/employee/empName') AS "EMP_NAME", 
EXTRACTVALUE(B.JOBSHEET_DETAILS, '/jobSheet/dateAttend/date') AS "DATE_ATTENDED" 
FROM JOBSHEET_XML_TAB B 
where XMLEXISTS('/jobSheet/employee[@empNo]/@empNo' passing B.JOBSHEET_DETAILS); 

内迭代为一体,其他 XMLQUERY犯规触发器内。它应该是一个错误时输出(空)。

enter image description here

我需要检查所有员工如果在这个迭代中的$ j是一个现有的雇员或不。 $ j = 4444是否可以在emp中执行另一个select count(*),其中no = $ num。

+0

请将当前和预期的输出显示为格式化文本,而不是图像;并包含您试图从中获取输出的XML。 –

回答

0

如果甚至可能,我不会在XPath中尝试这样做。您可以使用XMLQuery() or XMLTable()提取您感兴趣的元素和属性值,然后外连接到emp表以检查它们是否存在,并使用case表达式来决定显示哪些文本。

根据您的XML结构,似乎是从当前的代码,类似:

select x.job_details_id, 
    case when e.no is not null then 'Employee details match a current employee' 
    else 'Error in employee details (no match)' end as check_emp_details, 
    x.emp_no, 
    x.emp_name, 
    x.date_attended 
from jobsheet_xml_tab jxt 
cross join XMLTable(
    '/jobSheet/employee[@empNo]' 
    passing jxt.jobsheet_details 
    columns job_details_id number path './../@jobNo', 
    emp_no number path './@empNo', 
    emp_name varchar2(20) path './empName', 
    date_attended date path './../dateAttend/date' 
) x 
left join emp e on e.no = x.emp_no; 

与虚构的XML快速演示和emp记录在热膨胀系数:

with jobsheet_xml_tab(jobsheet_details) as (
    select xmltype('<jobSheet jobNo="666666"> 
<dateAttend> 
    <date>2017-05-01</date> 
</dateAttend> 
<employee empNo="7777"> 
    <empName>Joe</empName> 
</employee> 
</jobSheet>') from dual 
    union all 
    select xmltype('<jobSheet jobNo="777777"> 
<dateAttend> 
    <date>2017-05-03</date> 
</dateAttend> 
<employee empNo="4444"> 
    <empName>Jane</empName> 
</employee> 
</jobSheet>') from dual 
), 
emp (no) as (
    select 4444 from dual 
) 
select x.job_details_id, 
    case when e.no is not null then 'Employee details match a current employee' 
    else 'Error in employee details (no match)' end as check_emp_details, 
    x.emp_no, 
    x.emp_name, 
    x.date_attended 
from jobsheet_xml_tab jxt 
cross join XMLTable(
    '/jobSheet/employee[@empNo]' 
    passing jxt.jobsheet_details 
    columns job_details_id number path './../@jobNo', 
    emp_no number path './@empNo', 
    emp_name varchar2(20) path './empName', 
    date_attended date path './../dateAttend/date' 
) x 
left join emp e on e.no = x.emp_no; 

JOB_DETAILS_ID CHECK_EMP_DETAILS        EMP_NO EMP_NAME    DATE_ATTE 
-------------- ----------------------------------------- ---------- -------------------- --------- 
     666666 Error in employee details (no match)   7777 Joe     01-MAY-17 
     777777 Employee details match a current employee  4444 Jane     03-MAY-17 

它可能没有用处,但原则上这会应付有多位雇员分配给它的工作,而使用已弃用的extractvalue()则无法工作。