Я сталкиваюсь со странной проблемой при выполнении хранимой процедуры 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
' есть какая-то глупая ошибка, которую я не могу понять.