Я провел тщательный поиск по различным форумам и сайтам, и я думаю, что ошибка, которую я допускаю в своем коде, не использует переменную привязки.Не уверен, что это единственный выход, но после многих исследований я думаю, что это может быть.
Вот код, который я использую:
create or replace
PROCEDURE CUBE_VIEW (Var_dt varchar2 default '')
AUTHID CURRENT_USER
IS
Start_Date number;
End_Date number;
Var Date;
BEGIN
If Var_dt is null then
Var := SYSDATE;
Else
Var := to_date(Var_dt);
end if;
select TO_NUMBER(TO_CHAR(TRUNC(TRUNC(TO_DATE((select ADD_MONTHS((select TO_DATE(Var,'DD-
MON-YY') + (6-TO_NUMBER(TO_CHAR(TO_DATE(Var,'DD-MON-YY')+1,'D'))) from dual),-34) from dual),'DD-MON-YY'),'MM')-1,'MM'),'YYMMDD')) into Start_Date from dual;
select TO_NUMBER(TO_CHAR(TRUNC(TO_DATE((select ADD_MONTHS((select TO_DATE(Var,'DD-MON-YY') + (6-TO_NUMBER(TO_CHAR(TO_DATE(Var,'DD-MON-YY')+1,'D'))) from dual),-1) from dual),'DD-MON-YY'),'MM')-1,'YYMMDD')) into End_Date from dual;
DBMS_OUTPUT.PUT_LINE('Start Date is ' || Start_Date);
DBMS_OUTPUT.PUT_LINE('End Date is ' || End_Date);
execute immediate 'CREATE OR REPLACE VIEW F_SURVEY_YESTERDAY AS SELECT FLIGHTDATE FROM F_SURVEY_MULTICOL WHERE FLIGHTDATE BETWEEN Start_Date AND End_Date';
execute immediate 'CREATE OR REPLACE VIEW RESPONSE_YESTERDAY AS SELECT * FROM RESPONSE_SMALL WHERE FLIGHTDATE BETWEEN Start_Date AND End_Date';
end CUBE_VIEW;
Код успешно выполняется, нокогда я выполняю код, вот ошибка, которую я получаю.
Ошибка:
*Connecting to the database LocalEnvironment.
ORA-00904: "END_DATE": invalid identifier
ORA-06512: at "TESTING.CUBE_VIEW", line 17
ORA-06512: at line 6
Start Date is 90301
End Date is 111231
Process exited.
Disconnecting from the database LocalEnvironment.*
Когда я жестко кодирую значения, все работает нормально, но когда я генерирую значения изпроцедура, она ломается.Любое решение?
create or replace
PROCEDURE CUBE_VIEW (VAR_DT IN VARCHAR2 DEFAULT '')
AUTHID CURRENT_USER
AS
START_DATE NUMBER;
END_DATE NUMBER;
VAR DATE;
BEGIN
IF VAR_DT IS NULL THEN
VAR:= SYSDATE;
ELSE
VAR:= TO_DATE(VAR_DT);
END IF;
SELECT TO_NUMBER(TO_CHAR(TRUNC(TRUNC(TO_DATE((SELECT ADD_MONTHS((SELECT TO_DATE(VAR,'DD-MON-YY') + (6-TO_NUMBER(TO_CHAR(TO_DATE(VAR,'DD-MON-YY')+1,'D'))) FROM DUAL),-34) FROM DUAL),'DD-MON-YY'),'MM')-1,'MM'),'YYMMDD')) INTO START_DATE FROM DUAL;
SELECT TO_NUMBER(TO_CHAR(TRUNC(TRUNC(TO_DATE((SELECT ADD_MONTHS((SELECT TO_DATE(VAR,'DD-MON-YY') + (6-TO_NUMBER(TO_CHAR(TO_DATE(VAR,'DD-MON-YY')+1,'D'))) FROM DUAL),-1) FROM DUAL),'DD-MON-YY'),'MM')-1,'MM'),'YYMMDD')) INTO END_DATE FROM DUAL;
DBMS_OUTPUT.PUT_LINE('START DATE IS ' || START_DATE);
DBMS_OUTPUT.PUT_LINE('END DATE IS ' || END_DATE);
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW RESPONSE_YESTERDAY AS SELECT * FROM RESPONSE_SMALL WHERE FLIGHTDATE BETWEEN' ||START_DATE|| 'AND' ||END_DATE;
END CUBE_VIEW;
/
Вот так я устал от своего запроса после того, как разместил его здесь, но все равно это не сработало !!