Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

ORA-32036 while using WITH

607743Dec 4 2007 — edited Dec 5 2007

I will include the query below my question as it is very long.

I am using Microsoft SQL Server Reporting Services to connect to an Oracle Database (9i v 2). When I put in the query below I get the following error coming from the Oracle Server -

"TITLE: Microsoft Report Designer
------------------------------

An error occurred while executing the query.
ORA-32036: unsupported case for inlining of query name in WITH clause"

I found an explanation for this error - " There is at least one query name which is inlined more than once because it's definition query is too simple and references another query name. This is currently unsupported yet." - and taking out the sub-queries one by one it seems to be COMBINE_TWO sub-query that causes the issue. Apparently it doesn't like the Select * from BLAHBLAH and finds it to be unecessary. I have made this query using nested selects - but the code gets redundant and I end up having to use the same query two or three times....the whole statement takes far too long to execute.

Any coding suggestions or workaround suggestions would be appreciated - I have been looking at this problem so long that I have tunnel vision. There has to be a fix or a better way...

Thanks!

Brett

Here is the query....

WITH  
  /*This query finds all pending WO's and caculates all changing service 
  levels for limited, basic, internet and phone.  Any values that do not 
  change are kept at null, any services being disconnected are dropped to a negative
  and service being upgrades and/or downgraded but still kept are valued
  at their to_quantity value. */
  STEP_1 AS
  (
    SELECT
      WO.ACCOUNT_NUMBER,
      WO.WORK_ORDER_NUMBER,
      WO.WO_TYPE,
      WOD.SERVICE_CODE,
      CASE WHEN WOD.SERVICE_CODE = '101' AND WOD.FROM_QUANTITY != WOD.TO_QUANTITY THEN WOD.TO_QUANTITY - WOD.FROM_QUANTITY ELSE NULL END LIM,
      CASE WHEN WOD.SERVICE_CODE = '111' AND WOD.FROM_QUANTITY != WOD.TO_QUANTITY THEN WOD.TO_QUANTITY - WOD.FROM_QUANTITY ELSE NULL END EXP,
      CASE WHEN WOD.SERVICE_CODE = '30001' AND WOD.FROM_QUANTITY != WOD.TO_QUANTITY THEN WOD.TO_QUANTITY - WOD.FROM_QUANTITY ELSE NULL END HSI,
      CASE WHEN WOD.SERVICE_CODE IN ('LINE FL', 'ULTS FL') AND WOD.FROM_QUANTITY != WOD.TO_QUANTITY THEN WOD.TO_QUANTITY - WOD.FROM_QUANTITY ELSE NULL END PHONE
    FROM
      KAN_WORK_ORDER_MASTER WO INNER JOIN KAN_WORK_ORDER_DETAIL WOD ON WO.WORK_ORDER_NUMBER = WOD.WORK_ORDER_NUMBER
    WHERE
      WO.WO_TYPE IN ('DI', 'DW', 'IN', 'SR', 'UP')
      AND WOD.SERVICE_CODE IN ('101', '111', '30001', 'LINE FL', 'ULTS FL')
      AND POOL = 'A'
      AND WO_STATUS = ' '),
 
 /* This adds all values from step 1 and condenses all work orders
 into one row, a value for each service. */
 STEP_2 AS
 (
    SELECT
      ACCOUNT_NUMBER,
      WORK_ORDER_NUMBER,
      WO_TYPE,
      SUM(LIM) LIM,
      SUM(EXP) EXP,
      SUM(HSI) HSI,
      SUM(PHONE) PHONE
    FROM
      STEP_1
    GROUP BY
      ACCOUNT_NUMBER,
      WORK_ORDER_NUMBER,
      WO_TYPE
    ORDER BY
      ACCOUNT_NUMBER),
  
  /* This query takes the results from Step 2 and then looks at all service
  levels that were not included or changed in the work order detail file 
  and makes sure that unchanged services are included in the final total. 
  FOR EXAMPLE : Coming from step 2, if LIM is NULL we know that no changes 
  were done to LIM in the work order - so, if the customer has Limited then
  the service quantity is added to the total.  Else - if LIM is not null, then
  we know the service level was effected by the work order - so do not
  include the quantity from the services file because it will be innacurate
  once the work order is complete*/
  STEP_3 AS
  (
   SELECT
      WO.ACCOUNT_NUMBER,
      WO.WORK_ORDER_NUMBER,
      WO.WO_TYPE,
      CASE WHEN LIM IS NULL AND CS.SERVICE_CODE = '101' THEN (CS.SERVICE_QUANTITY + CS.SERVICE_QUANTITY_TO_FREE) ELSE NULL END LIM,
      CASE WHEN EXP IS NULL AND CS.SERVICE_CODE = '111' THEN (CS.SERVICE_QUANTITY + CS.SERVICE_QUANTITY_TO_FREE) ELSE NULL END EXP,
      CASE WHEN HSI IS NULL AND CS.SERVICE_CODE = '30001' THEN (CS.SERVICE_QUANTITY + CS.SERVICE_QUANTITY_TO_FREE) ELSE NULL END HSI,
      CASE WHEN PHONE IS NULL AND CS.SERVICE_CODE IN ('LINE FL', 'ULTS FL') THEN (CS.SERVICE_QUANTITY + CS.SERVICE_QUANTITY_TO_FREE) ELSE NULL END PHONE
    FROM
      STEP_2 WO INNER JOIN KAN_CUSTOMER_SERVICES CS ON WO.ACCOUNT_NUMBER = CS.ACCOUNT_NUMBER
    WHERE
      CS.SERVICE_CODE IN ('101', '111', '30001', 'LINE FL', 'ULTS FL')
      AND CS.SERVICE_STATUS = 'A'),

  /* This step calculated the current service level. */
  STEP_4 AS
  (
    SELECT
          ACCOUNT_NUMBER,
          WORK_ORDER_NUMBER,
          WO_TYPE,
          SUM(LIM) LIM,
          SUM(EXP) EXP,
          SUM(HSI) HSI,
          SUM(PHONE) PHONE
        FROM
          STEP_3
        GROUP BY
          ACCOUNT_NUMBER,
          WORK_ORDER_NUMBER,
          WO_TYPE
      ),
  
  COMBINE_TWO AS
  (
    SELECT 
      *
    FROM
      STEP_2
    UNION ALL
    SELECT
      *    
    FROM
      STEP_4
  )
  

    SELECT
      WOM.SCHEDULE_DATE,
      COMBINE_TWO.ACCOUNT_NUMBER,
      COMBINE_TWO.WORK_ORDER_NUMBER,
      COMBINE_TWO.WO_TYPE,
      HM.ADDRESS_LINE_1,
      HM.ADDRESS_LINE_2,
      HM.ADDRESS_LINE_3,
      HM.ADDRESS_LINE_4,
      SUM(LIM) LIM,
      SUM(EXP) EXP,
      SUM(HSI) HSI,
      SUM(PHONE) PHONE
    FROM
        COMBINE_TWO
        INNER JOIN KAN_CUSTOMER_MASTER CM ON COMBINE_TWO.ACCOUNT_NUMBER = CM.ACCOUNT_NUMBER
        INNER JOIN KAN_HOUSE_MASTER HM ON CM.HOUSE_NUMBER = HM.HOUSE_NUMBER
        INNER JOIN KAN_WORK_ORDER_MASTER WOM ON COMBINE_TWO.WORK_ORDER_NUMBER = WOM.WORK_ORDER_NUMBER
    GROUP BY
      WOM.SCHEDULE_DATE,
      COMBINE_TWO.ACCOUNT_NUMBER,
      COMBINE_TWO.WORK_ORDER_NUMBER,
      COMBINE_TWO.WO_TYPE,
      HM.ADDRESS_LINE_1,
      HM.ADDRESS_LINE_2,
      HM.ADDRESS_LINE_3,
      HM.ADDRESS_LINE_4
    HAVING
      (
        SUM(LIM) <= 0
        AND SUM(EXP) <= 0
      )
      AND
      (
        SUM(HSI) >= 1
        OR SUM(PHONE) >= 1
      )
    ORDER BY
      ACCOUNT_NUMBER
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jan 2 2008
Added on Dec 4 2007
4 comments
804 views