Search code examples
sqloracleoracle-sqldeveloper

Why am I unable to pass my variables into my ORACLE SQL statement?


When I run the below SQL code I am getting the below error message. Why am I unable to pass the variables into the SQL statement? I am not sure if this is an issue of dynamic vs static SQL or if I am placing my variable sin the incorrect location. Any help would be much appreciated. Thank you!

ORA-00904: "FIRSTDAYNXTQTR": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause:
*Action: Error at Line: 24 Column: 27

UNDEFINE FirstDayQtr
UNDEFINE FirstDayNxtQtr
DEFINE FirstDayQtr = to_date ('01-JUL-20', 'DD-MM-YY')
DEFINE FirstDayNxtQtr = to_date ('01-OCT-20', 'DD-MM-YY')




WITH ea
AS 

(

--Members that moved to VT during the qtr (eff_date during qtr)
SELECT DISTINCT SSN
, STATE
FROM (
--Effective Date During Quarter
    SELECT *
    FROM
    (SELECT * FROM EMP_ADDRESS 
    WHERE STATE = 'VT'
    AND EFF_DATE >= FirstDayQtr
    AND EFF_DATE < FirstDayNxtQtr
    AND ADDRESS_KEY = '0'
    
    )ea
    WHERE ea.EFF_DATE = (
            SELECT MAX(ea2.EFF_DATE)
                FROM EMP_ADDRESS ea2
            WHERE ea2.CONTROL_ID = ea.CONTROL_ID
            AND ea2.SSN = ea.SSN)


    UNION

    SELECT *
    FROM
    (SELECT *
    FROM EMP_ADDRESS
    WHERE STATE = 'VT'
    AND EFF_DATE < FirstDayQtr
    AND ADDRESS_KEY = '0') ea
    
    WHERE ea.EFF_DATE = (
        SELECT MAX(ea1.EFF_DATE) 
        FROM EMP_ADDRESS ea1 
        WHERE ea.ssn=ea1.ssn 
        AND ea.EFF_DATE < FirstDayQtr 
        AND ea1.EFF_DATE < FirstDayQtr))
)        

,

eid AS (
       SELECT *
    FROM
    (SELECT *
        FROM EMP_INFO_DATED eid
        WHERE eid.CONTROL_ID = 'SMLMKT'
        AND eid.EFF_DATE = (
            SELECT MAX(eid1.EFF_DATE) 
            FROM EMP_INFO_DATED eid1
            WHERE eid.SSN = eid1.SSN 
            AND eid1.CONTROL_ID = 'SMLMKT') 
     ) eid3      
    WHERE eid3.LATEST_HIRE_DATE <= FirstDayNxtQtr
    AND (eid3.LAST_TERM_DATE > FirstDayQtr
    OR eid3.LAST_TERM_DATE is NULL)
)
,


ees AS (   
    SELECT *
    FROM employee_selections ees
    WHERE ees.control_id = 'SMLMKT'
    AND ees.BENEFIT_ID = 'MEDICAL' 
    
    AND ees.life_event_date = (
        SELECT MAX(x.life_event_date) 
        FROM employee_life_events x
        WHERE x.ssn = ees.ssn
        AND x.control_id = 'SMLMKT' 
        AND ees.p_clients_id_i = x.p_clients_id_i 
        AND x.life_event_status = 'C')
    
    AND ees.le_seq_no = (
        SELECT MAX(x.le_seq_no) 
        FROM employee_life_events x 
        WHERE x.ssn = ees.ssn
        AND x.control_id = 'SMLMKT' 
        AND ees.p_clients_id_i = x.p_clients_id_i 
        AND x.life_event_status = 'C'
        AND ees.life_event_date = x.life_event_date)
    )
    
    

SELECT 
cts.NAME as "Client Name"
, cssn.REAL_SSN as "Employee SSN"
--, ea.SSN as "FAKE SSN REMOVE"
, eid.LAST_NAME as "Last Name"
, eid.FIRST_NAME as "First Name"
, ea.STATE as "Resident State"
, eid.LATEST_HIRE_DATE as "Hire Date"
, pi.DESCR1 as "Plan Name"
, ees.OPTION_ID as "Tier"
, ees.BENEFIT_EFF_DATE as "Coverage Start Date"
, eid.LAST_TERM_DATE as "Coverage End Date"
--, eid.LAST_TERM_DATE

FROM eid 
INNER JOIN ea
ON eid.SSN = ea.SSN

LEFT JOIN ees
ON eid.SSN = ees.SSN

JOIN COMP_SSN cssn
ON eid.SSN = cssn.SSN

LEFT JOIN PLAN_INFO pi
ON ees.PLAN_ID = pi.PLAN_ID
AND ees.BENEFIT_ID = pi.BENEFIT_ID 

JOIN CLIENTS cts
ON eid.CURRENT_CO = cts.CLIENTS_ID

Solution

  • YOu have to prefix your substitution variable name with '&'

    See Using Substitution Variables.