Oracle XQuery通过消息选择并检查现有员工

Oracle XQuery通过消息选择并检查现有员工,oracle,oracle-sqldeveloper,xquery,xquery-sql,Oracle,Oracle Sqldeveloper,Xquery,Xquery Sql,我需要在使用xquery的列中输出一条消息,说明是否匹配员工。我现在使用4444作为占位符,不知道如何在查询中迭代 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 detai

我需要在使用xquery的列中输出一条消息,说明是否匹配员工。我现在使用4444作为占位符,不知道如何在查询中迭代

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中的else不会触发。当它应该是错误时,它输出null


我需要检查所有员工,看看这个迭代中的$j是否是现有员工$j=4444是否可以从emp执行另一个select count*,其中no=$num.

如果可能的话,我根本不会在XPath中尝试这样做。您可以使用提取感兴趣的元素和属性值,然后外部连接到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;
使用CTEs中的合成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则无法解决这一问题。

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