2017-05-27 4 views
-2

xqueryを使用している列に「一致」または「従業員でない」というメッセージを出力する必要があります。私は1つ、他の XMLQUERY doesntのトリガ内部のクエリ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); 

内を反復処理する方法を知ってはいけない、今のプレースホルダとして4444を使用しています。エラーでなければならないときは(null)を出力します。

enter image description here

この回の反復で$ jは、既存の従業員であるかどうか、私はすべての従業員をチェックする必要があります。 $ j = 4444では、no = $ numのempから別のselect count(*)を実行することができます。

+0

現在の出力と期待される出力を、画像ではなく書式付きのテキストとして表示してください。その出力を取得しようとしているXMLが含まれています。 –

答えて

0

XPathでは、それが可能であれば、私はそれをやろうとはしません。 XMLQuery() or XMLTable()を使用して、目的の要素と属性値を抽出し、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 

それは:あなたのXMLの構造は、あなたの現在のコードからと思われるものに基づいて

、何かのように:CTEの中に作られたアップXMLおよびemp記録と

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; 

クイックデモ有用ではありませんが、原則として、複数の従業員が割り当てられているジョブに対処することになります。これは非推奨のextractvalue()を使用できませんでした。

関連する問題