Возникла странная проблема при выполнении Oracle хранимой процедуры - PullRequest
1 голос
/ 17 января 2020

Я сталкиваюсь со странной проблемой при выполнении хранимой процедуры Oracle. Я смог выбрать данные, которые так тревожно вставляли выбранные данные в другую таблицу.

Ниже приведен запрос, вызывающий проблему.

BEGIN
EXECUTE IMMEDIATE
'INSERT INTO STG_MEMBER_MONTH_1
(
 MEMBER_ID
,EMPLOYER_GROUP_ID
,MEMBER_BIRTH_DATE
,SPAN_FROM_DATE
,GROUP_ID_FINAL
,GROUP_SIZE
,NAME_TO_BE_USED
,MEM_DOB
,MM
,MEMBER_AGE_FINAL
,ELIG_YEAR
,ELIG_MONTH
,AGE_BAND
)
WITH CTE_Member_Month_Group_Id_Final AS (
SELECT
 a.MEMBER_ID
,a.EMPLOYER_GROUP_ID
,a.MEMBER_BIRTH_DATE
,a.SPAN_FROM_DATE
b.ACCOUNT_NUM as GROUP_ID_FINAL
from STG_MEMBER_MONTH_2 a LEFT JOIN
(SELECT DISTINCT GRP_ID,ACCOUNT_NUM from ACCOUNT_MAPPING)b
ON a.EMPLOYER_GROUP_ID= b.GRP_ID)

,CTE_Member_Month_Group_Name as (
    SELECT a.*,b.GROUP_SIZE,b.GROUP_NAME as NAME_TO_BE_USED 
    from CTE_Member_Month_Group_Id_Final  a
    LEFT JOIN APP_CALENDAR b
    ON a.GROUP_ID_FINAL= b.GROUP_ID
)
,CTE_Max_DOB AS (
     SELECT a.MEMBER_ID,b.MEMBER_BIRTH_DATE AS MEM_DOB from
       (SELECT MEMBER_ID,max(SPAN_FROM_DATE) as SPAN_FROM_DATE from CTE_Member_Month_Group_Name
        GROUP BY MEMBER_ID)
     LEFT OUTER JOIN CTE_Member_Month_Group_Name b
     ON a.MEMBER_ID = b.MEMBER_ID
     AND a.SPAN_FROM_DATE = b.SPAN_FROM_DATE)
,CTE_Age_Band_Prev AS (
     SELECT a.*,b.MEM_DOB,1 as "MM"
    ,trunc(months_between(a.SPAN_FROM_DATE,B.MEM_DOB)/12) as "MEMBER_AGE_FINAL"
    ,extract(year from a.SPAN_FROM_DATE)                  as "ELIG_YEAR"
    ,extract(month from a.SPAN_FROM_DATE)                 as "ELIG_MONTH"
    from CTE_Member_Month_Group_Name a
    LEFT OUTER JOIN CTE_Max_DOB  b
    ON a.MEMBER_ID=b.MEMBER_ID
)
,CTE_Age_Band AS (
    SELECT a.*,
    CASE
        WHEN ltrim("MEMBER_AGE_FINAL") < 1 
        THEN 'Less than one year'
        WHEN ltrim("MEMBER_AGE_FINAL") > 17 and ltrim("MEMBER_AGE_FINAL") <=29 
        THEN '18 - 29 years'
        WHEN ltrim("MEMBER_AGE_FINAL") > 29 and ltrim("MEMBER_AGE_FINAL") <=39 
        THEN '29 - 39 years'
        ELSE 'More than 40 years'
    END as "AGE_BAND"
    from CTE_Age_Band_Prev a

)
SELECT * from CTE_Age_Band';
END;
/

Я могу выбрать все из CTE_Age_Band без проблем, но не удалось вставить выбранные данные в таблицу STG_MEMBER_MONTH_1. Я получаю сообщение об ошибке ниже

ORA-06550: LINE 57,column 1:
PLS-00103: Encountered the symbol "," when expecting one of the following:

Если я удалил последний оператор CTE CTE_Age_Band сверху и удалил столбец AGE_BAND из оператора вставки, он выполняется без ошибок. Измененный лог c показан ниже:

BEGIN
EXECUTE IMMEDIATE
'INSERT INTO STG_MEMBER_MONTH_1
(
 MEMBER_ID
,EMPLOYER_GROUP_ID
,MEMBER_BIRTH_DATE
,SPAN_FROM_DATE
,GROUP_ID_FINAL
,GROUP_SIZE
,NAME_TO_BE_USED
,MEM_DOB
,MM
,MEMBER_AGE_FINAL
,ELIG_YEAR
,ELIG_MONTH
)
WITH CTE_Member_Month_Group_Id_Final AS (
SELECT
 a.MEMBER_ID
,a.EMPLOYER_GROUP_ID
,a.MEMBER_BIRTH_DATE
,a.SPAN_FROM_DATE
b.ACCOUNT_NUM as GROUP_ID_FINAL
from STG_MEMBER_MONTH_2 a LEFT JOIN
(SELECT DISTINCT GRP_ID,ACCOUNT_NUM from ACCOUNT_MAPPING)b
ON a.EMPLOYER_GROUP_ID= b.GRP_ID)

,CTE_Member_Month_Group_Name as (
SELECT a.*,b.GROUP_SIZE,b.GROUP_NAME as NAME_TO_BE_USED from CTE_Member_Month_Group_Id_Final  a
LEFT JOIN APP_CALENDAR b
ON a.GROUP_ID_FINAL= b.GROUP_ID
)
,CTE_Max_DOB AS (
SELECT a.MEMBER_ID,b.MEMBER_BIRTH_DATE AS MEM_DOB from
       (SELECT MEMBER_ID,max(SPAN_FROM_DATE) as SPAN_FROM_DATE from CTE_Member_Month_Group_Name
        GROUP BY MEMBER_ID)
LEFT OUTER JOIN CTE_Member_Month_Group_Name b
ON a.MEMBER_ID = b.MEMBER_ID
AND a.SPAN_FROM_DATE = b.SPAN_FROM_DATE)
,CTE_Age_Band_Prev AS (
   SELECT a.*,b.MEM_DOB,1 as "MM"
   ,trunc(months_between(a.SPAN_FROM_DATE,B.MEM_DOB)/12) as "MEMBER_AGE_FINAL"
   ,extract(year from a.SPAN_FROM_DATE)                  as "ELIG_YEAR"
   ,extract(month from a.SPAN_FROM_DATE)                 as "ELIG_MONTH"
   from CTE_Member_Month_Group_Name a
   LEFT OUTER JOIN CTE_Max_DOB  b
   ON a.MEMBER_ID=b.MEMBER_ID
)
SELECT * from CTE_Age_Band_Prev';
END;
/

Похоже, что в последнем CTE 'CTE_Age_Band' есть какая-то глупая ошибка, которую я не могу понять.

1 Ответ

5 голосов
/ 17 января 2020

Проблема в строковых литералах внутри вашей строки SQL. Чтобы поместить в строку одинарную кавычку, нужно удвоить одинарные кавычки, то есть поместить две из них рядом:

BEGIN
EXECUTE IMMEDIATE
'INSERT INTO STG_MEMBER_MONTH_1
(
 MEMBER_ID
,EMPLOYER_GROUP_ID
,MEMBER_BIRTH_DATE
,SPAN_FROM_DATE
,GROUP_ID_FINAL
,GROUP_SIZE
,NAME_TO_BE_USED
,MEM_DOB
,MM
,MEMBER_AGE_FINAL
,ELIG_YEAR
,ELIG_MONTH
,AGE_BAND
)
WITH CTE_Member_Month_Group_Id_Final AS (
SELECT
 a.MEMBER_ID
,a.EMPLOYER_GROUP_ID
,a.MEMBER_BIRTH_DATE
,a.SPAN_FROM_DATE
b.ACCOUNT_NUM as GROUP_ID_FINAL
from STG_MEMBER_MONTH_2 a LEFT JOIN
(SELECT DISTINCT GRP_ID,ACCOUNT_NUM from ACCOUNT_MAPPING)b
ON a.EMPLOYER_GROUP_ID= b.GRP_ID)

,CTE_Member_Month_Group_Name as (
    SELECT a.*,b.GROUP_SIZE,b.GROUP_NAME as NAME_TO_BE_USED 
    from CTE_Member_Month_Group_Id_Final  a
    LEFT JOIN APP_CALENDAR b
    ON a.GROUP_ID_FINAL= b.GROUP_ID
)
,CTE_Max_DOB AS (
     SELECT a.MEMBER_ID,b.MEMBER_BIRTH_DATE AS MEM_DOB from
       (SELECT MEMBER_ID,max(SPAN_FROM_DATE) as SPAN_FROM_DATE from CTE_Member_Month_Group_Name
        GROUP BY MEMBER_ID)
     LEFT OUTER JOIN CTE_Member_Month_Group_Name b
     ON a.MEMBER_ID = b.MEMBER_ID
     AND a.SPAN_FROM_DATE = b.SPAN_FROM_DATE)
,CTE_Age_Band_Prev AS (
     SELECT a.*,b.MEM_DOB,1 as "MM"
    ,trunc(months_between(a.SPAN_FROM_DATE,B.MEM_DOB)/12) as "MEMBER_AGE_FINAL"
    ,extract(year from a.SPAN_FROM_DATE)                  as "ELIG_YEAR"
    ,extract(month from a.SPAN_FROM_DATE)                 as "ELIG_MONTH"
    from CTE_Member_Month_Group_Name a
    LEFT OUTER JOIN CTE_Max_DOB  b
    ON a.MEMBER_ID=b.MEMBER_ID
)
,CTE_Age_Band AS (
    SELECT a.*,
    CASE
        WHEN ltrim("MEMBER_AGE_FINAL") < 1 
        THEN ''Less than one year''
        WHEN ltrim("MEMBER_AGE_FINAL") > 17 and ltrim("MEMBER_AGE_FINAL") <=29 
        THEN ''18 - 29 years''
        WHEN ltrim("MEMBER_AGE_FINAL") > 29 and ltrim("MEMBER_AGE_FINAL") <=39 
        THEN ''29 - 39 years''
        ELSE ''More than 40 years''
    END as "AGE_BAND"
    from CTE_Age_Band_Prev a

)
SELECT * from CTE_Age_Band';
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...