PL/SQL。无法从 xmltable 中提取值

PL/SQL. Cannot extract values from xmltable

我正在尝试发送一个 clob,然后像这样对其进行解构:

这是我发送消息的方式:

declare
  messageClob clob;
  log_id number;
begin
  log_id := 12; --for testing
  messageClob := to_clob(
  '
      <myReq xmlns="http://xxx/xx/x" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://xxx/xx/x file:/C:/Users/User1/Documents/test.xsd">
         <signature>HelloWorld</signature>
         <status>End</status>
         <mydate>2005-03-29T13:24:36.000</mydate>
      </myReq >
  ');
  my_pkg.getMyReq(p_messageClob => messageClob,
                  p_logId       => log_id);
end;

这是解构它的代码:

  procedure getMyReq(p_messageClob clob, p_logId number) is
    logHistoryId number;
  begin

    if p_messageClob is not null then
      dbms_output. put_line(p_messageClob);

      for message In (select * from xmltable(
                        xmlnamespaces(default 'http://xxx/xx/x'),
                        'myReq' passing xmltype(p_messageClob)
                        columns
                          signature varchar2(50) path 'signature',
                          status varchar2(10) path 'status',
                          mydate date path 'mydate')) 
      loop
        dbms_output.put_line(message.signature || ', ' || message.status|| ', ' || message.mydate );
       
      end loop;
    end if;
  exception
    ...some code
  end getMyReq;

我在这里错过了什么?这与往常一样,但仍然没有打印注释。我确定该消息不为空,因为 dbms_output. put_line(p_messageClob); 打印了 clob。

问题是这样的:

mydate date path 'mydate'

(并且您的程序消除了错误)。它实际上在做 to_date('2005-03-29T13:24:36.000', 'YYYY-MM-DD') 抛出相同的错误。

您可以将其作为字符串检索:

mydate varchar2(23) path 'mydate'

并稍后转换它,或将其作为时间戳检索,它甚至可以处理 ISO-8601 'T' 分隔符,这与 Oracle 的时间戳文字不同:

mydate timestamp path 'mydate'

db<>fiddle

我建议您将 to_timestamp 与 on conversion error 子句一起使用:

      for message In (select 
                        signature,
                        status,
                        to_timestamp(
                            mydate default null on conversion error,
                            'YYYY-MM-DD"T"hh24:mi:ssxff'
                        ) mydate
                      from xmltable(
                        xmlnamespaces(default 'http://xxx/xx/x'),
                        'myReq' passing xmltype(p_messageClob)
                        columns
                          signature varchar2(50) path 'signature',
                          status varchar2(10) path 'status',
                          mydate varchar2(27) path 'mydate'))