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'
我建议您将 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'))
我正在尝试发送一个 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'
我建议您将 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'))