ORA-00932: 数据类型不一致:预期 - 得到 CLOB 00932。00000
ORA-00932: inconsistent datatypes: expected - got CLOB 00932. 00000
我有包含大字符串的列 response_xml 和 request_xml。我对这个大字符串使用了子字符串函数,以便从 response_xml 获取 SUBSCRIPTION_ID 并从 request_xml 获取 orderType。查询工作正常。但是现在我想为这个查询设置条件,这样它应该只 return SUBSCRIPTION_ID where orderType='NEW'。我使用了以下查询,但导致错误 ORA-00932: inconsistent datatypes: expected - got CLOB 00932. 00000 - "inconsistent datatypes: expected %s got %s"
。我想我需要将列 REQUEST_XML 从 clob 转换为 VARCHAR 或 XMLTYPE,然后在其上应用子字符串。但不知道如何做到这一点。错误出现在条件 iw.order_type='NEW' 的地方。这是我的查询:
select iw.order_type
from (
SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'),
'<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '')
AS SUBSCRIPTION_ID ,
REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '')
AS order_type,
CREATE_DATE
FROM
SOAP_MONITORING
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='NEW'
order by iw.CREATE_DATE desc
列表达式作为 CLOB 返回;您可以将其转换为 VARCHAR2:
CAST(REPLACE(REPLACE(
REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'),
'<ns7:orderType>', ''), '</ns7:orderType>', '')
AS VARCHAR(10)) AS order_type,
您指定的大小应该足够大,可以满足您在该元素中期望的最长值。但是,如果您需要一个字符串,那么在该正则表达式中包含 \d+
是不正确的 - 如果实际值为 NEW,您将返回 null。例如,您可以使用 '<ns7:orderType>.+</ns7:orderType>'
。
如果您希望它更有用,您也可以将 subscription_id
表达式包装在 to_number()
调用中;您已经知道这是来自 \d+
正则表达式的数值,它似乎更合适。
我有包含大字符串的列 response_xml 和 request_xml。我对这个大字符串使用了子字符串函数,以便从 response_xml 获取 SUBSCRIPTION_ID 并从 request_xml 获取 orderType。查询工作正常。但是现在我想为这个查询设置条件,这样它应该只 return SUBSCRIPTION_ID where orderType='NEW'。我使用了以下查询,但导致错误 ORA-00932: inconsistent datatypes: expected - got CLOB 00932. 00000 - "inconsistent datatypes: expected %s got %s"
。我想我需要将列 REQUEST_XML 从 clob 转换为 VARCHAR 或 XMLTYPE,然后在其上应用子字符串。但不知道如何做到这一点。错误出现在条件 iw.order_type='NEW' 的地方。这是我的查询:
select iw.order_type
from (
SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'),
'<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '')
AS SUBSCRIPTION_ID ,
REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '')
AS order_type,
CREATE_DATE
FROM
SOAP_MONITORING
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='NEW'
order by iw.CREATE_DATE desc
列表达式作为 CLOB 返回;您可以将其转换为 VARCHAR2:
CAST(REPLACE(REPLACE(
REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'),
'<ns7:orderType>', ''), '</ns7:orderType>', '')
AS VARCHAR(10)) AS order_type,
您指定的大小应该足够大,可以满足您在该元素中期望的最长值。但是,如果您需要一个字符串,那么在该正则表达式中包含 \d+
是不正确的 - 如果实际值为 NEW,您将返回 null。例如,您可以使用 '<ns7:orderType>.+</ns7:orderType>'
。
如果您希望它更有用,您也可以将 subscription_id
表达式包装在 to_number()
调用中;您已经知道这是来自 \d+
正则表达式的数值,它似乎更合适。