【问题标题】:Expression must have same datatype as corresponding expression WHEN UNION表达式必须与对应的表达式 WHEN UNION 具有相同的数据类型
【发布时间】:2019-10-31 19:46:05
【问题描述】:

每当我尝试运行以下查询时都会收到此异常。我想提一下,这是我第一次使用 union sql 子句。

<Oct 31, 2019 1:05:24 PM EET> <Notice> <Stdout> <BEA-000000> <2019-10-31 13:05:24.312 ERROR 21053 --- [ (self-tuning)'] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-01790: expression must have same datatype as corresponding expression> 
<Oct 31, 2019 1:05:24 PM EET> <Notice> <Stdout> <BEA-000000> <2019-10-31 13:05:24.324 ERROR 21053 --- [ (self-tuning)'] o.s.boot.web.support.ErrorPageFilter     : Forwarding to error page from request [/api/selling/gdp] due to exception [Database problem: org.hibernate.exception.SQLGrammarException: could not extract ResultSet]

com.example.btbsc.error.BadRequestAlertException: Database problem: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

我已经在 stackoverflow 上尝试过类似的问题,但仍然无法弄清楚我的问题出在哪里。

查询:

SELECT  H_DATE,
        CUSTOMER_NO,
        FULL_NAME,
        PRODUCT_CODE,
        PRODUCT_NAME,
        OPENING_DATE,
        CLOSING_DATE,
        UNIT_ID,
        UNIT_NAME,
        SUC_ID,
        HEADQ_NAME,
        CUSTOMER_TYPE
   FROM bt_nmp.PACHETE_MICRO_IMM
  WHERE H_DATE = :p_H_DATE
    AND CUSTOMER_NO = NVL(:p_customer_no,CUSTOMER_NO)
    AND ( :p_opening_date is null OR OPENING_DATE = :p_opening_date )
    AND CUSTOMER_TYPE IN (
          select nvl(:p_cust_categ,CUSTOMER_TYPE) as CUST_CATEG from dual
          UNION
          SELECT EXTRACTVALUE (t.COLUMN_VALUE, '/e') AS CUST_CATEG
          FROM (select :p_cust_categ as CUST_CATEG from dual) m,
               TABLE(
                 XMLSEQUENCE(
                   xmltype(
                     '<e><e>' || REPLACE (m.CUST_CATEG, ',', '</e><e>') || '</e></e>'
                   ).EXTRACT('e/e')
                 )
               ) t
        )
    AND NVL(PRODUCT_NAME,'-') IN (
          select nvl(:p_prod_list,NVL(PRODUCT_NAME,'-')) as PROD_LIST from   dual
          UNION
          SELECT EXTRACTVALUE (t.COLUMN_VALUE, '/e') AS PROD_LIST
          FROM (select :p_prod_list as PROD_LIST from dual) m,
               TABLE(
                 XMLSEQUENCE(
                   xmltype(
                     '<e><e>' || REPLACE (m.PROD_LIST, ',', '</e><e>') || '</e></e>'
                   ).EXTRACT('e/e')
                 )
               ) t
        )
    AND (:p_unit_id is null or UNIT_ID = :p_unit_id)
ORDER BY CUSTOMER_NO ASC,H_DATE DESC

【问题讨论】:

  • edit 提出minimal reproducible example 的问题,包括表的DDL 语句;复制问题的一些示例数据的 DML 语句;您正在使用的绑定变量的详细信息;样本数据的预期输出;以及您尝试应用的逻辑的英文描述(因为它并不总是容易遵循纯代码问题)。

标签: sql oracle union


【解决方案1】:

nvl(:p_cust_categ,CUSTOMER_TYPE)EXTRACTVALUE(t.COLUMN_VALUE, '/e') 似乎不匹配。

您可以在联合查询中使用TO_CHAR(nvl(:p_cust_categ,CUSTOMER_TYPE))TO_CHAR(EXTRACTVALUE(t.COLUMN_VALUE, '/e')),如下所示。它会帮助你解决问题

SELECT  H_DATE,
        CUSTOMER_NO,
        FULL_NAME,
        PRODUCT_CODE,
        PRODUCT_NAME,
        OPENING_DATE,
        CLOSING_DATE,
        UNIT_ID,
        UNIT_NAME,
        SUC_ID,
        HEADQ_NAME,
        CUSTOMER_TYPE
   FROM bt_nmp.PACHETE_MICRO_IMM
  WHERE H_DATE = :p_H_DATE
    AND CUSTOMER_NO = NVL(:p_customer_no,CUSTOMER_NO)
    AND ( :p_opening_date is null OR OPENING_DATE = :p_opening_date )
    AND CUSTOMER_TYPE IN (
          select TO_CHAR(nvl(:p_cust_categ,CUSTOMER_TYPE)) as CUST_CATEG from dual
          UNION
          SELECT TO_CHAR(EXTRACTVALUE(t.COLUMN_VALUE, '/e')) AS CUST_CATEG
          FROM (select :p_cust_categ as CUST_CATEG from dual) m,
               TABLE(
                 XMLSEQUENCE(
                   xmltype(
                     '<e><e>' || REPLACE (m.CUST_CATEG, ',', '</e><e>') || '</e></e>'
                   ).EXTRACT('e/e')
                 )
               ) t
        )
    AND NVL(PRODUCT_NAME,'-') IN (
          select TO_CHAR(nvl(:p_prod_list,NVL(PRODUCT_NAME,'-'))) as PROD_LIST from   dual
          UNION
          SELECT TO_CHAR(EXTRACTVALUE(t.COLUMN_VALUE, '/e')) AS PROD_LIST
          FROM (select :p_prod_list as PROD_LIST from dual) m,
               TABLE(
                 XMLSEQUENCE(
                   xmltype(
                     '<e><e>' || REPLACE (m.PROD_LIST, ',', '</e><e>') || '</e></e>'
                   ).EXTRACT('e/e')
                 )
               ) t
        )
    AND (:p_unit_id is null or UNIT_ID = :p_unit_id)
ORDER BY CUSTOMER_NO ASC,H_DATE DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多