Выражение должно иметь тот же тип данных, что и соответствующее выражение WHEN UNION - PullRequest
0 голосов
/ 31 октября 2019

Я получаю это исключение всякий раз, когда пытаюсь выполнить следующий запрос. Хочу отметить, что я впервые использую предложение 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

1 Ответ

0 голосов
/ 31 октября 2019

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
...