Ошибка в процедуре pl / sql: невозможно использовать переменную связывания - PullRequest
0 голосов
/ 04 февраля 2012

Я провел тщательный поиск по различным форумам и сайтам, и я думаю, что ошибка, которую я допускаю в своем коде, не использует переменную привязки.Не уверен, что это единственный выход, но после многих исследований я думаю, что это может быть.

Вот код, который я использую:

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;
/

Вот так я устал от своего запроса после того, как разместил его здесь, но все равно это не сработало !!

1 Ответ

3 голосов
/ 04 февраля 2012

В конце вы должны извлечь Start_Date и End_Date из динамического SQL:

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;

Однако учтите, что это number переменных, а не dateвозникли дополнительные проблемы, если вы не измените это.

РЕДАКТИРОВАТЬ: В соответствии с просьбой полный код, который работает для меня.Однако это зависит от типа NUMBER столбца FLIGHTDATE.Код работает, но вы можете узнать, почему вы передаете VARCHAR2 вместо DATE и почему START_DATE и END_DATE равны NUMBER, а не DATE.Это, безусловно, сэкономило бы много каста и облегчило бы поддержку этих отборов.

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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...