PL / SQL. Не удается извлечь значения из xmltable - PullRequest
0 голосов
/ 05 августа 2020
• 1000 1006 *
  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); печатает тряпку.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Проблема в следующем:

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

0 голосов
/ 05 августа 2020

Я бы посоветовал вам использовать 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')) 
...