Apex ORA-01008: не все переменные связаны с переменными хоста

Я работаю в среде Apex, где мне нужен динамический SQL-запрос. Apex предоставляет этот API с помощью "Классического отчета (в зависимости от функции)". Я хотел бы, чтобы вы обратили ваше внимание на строку 8. Мои апполиции перепутаны, когда я вставляю их в stackru. Теперь проблема в том, что я получаю сообщение об ошибке "ORA-01008: не все переменные связаны", что забавно, потому что, когда я меняю:TEAM_SELECTOR в строке 8 на что-то вроде "MYSQL" (что является именем команды), то этот код работает без ошибок. Обратите внимание:TEAM_SELECTOR также используется в возвращаемом запросе без проблем. Также я использую APEX 5.

    DECLARE
        v_time INT;
        v_start_time int;
        v_end_time int;
        v_rownum int := 1;
        v_max_shifts int;
        v_location INT;
        v_P4_team_selector varchar2(30) := :TEAM_SELECTOR;
BEGIN

    select extract(hour from CAST(sysdate AS TIMESTAMP)) into v_time from dual;

    select count(*) into v_max_shifts from oncall_shift
        where team = v_P4_team_selector;

    FOR i IN 0..v_max_shifts
    LOOP

            select start_time into v_start_time from (select * from oncall_shift where team =v_P4_team_selector)
        where rownum = v_rownum;
            select end_time into v_end_time from (select * from oncall_shift where team =v_P4_team_selector)
        where rownum = v_rownum;
        v_rownum := v_rownum + 1;   

        if v_time >= v_start_time and v_time <= v_end_time
        then

                select location into v_location from oncall_shift
            where team = v_P4_team_selector
            and start_time = v_start_time
            and end_time = v_end_time;

            return '
                    SELECT E.FNAME "First Name",E.LNAME "Last Name",E.OFFICE_NUM "Office Number", E.MOBILE_NUM "Mobile Number",L.NAME Location, o.position "Primary/Secondary"
                FROM EMPLOYEE E, LOCATION L, ON_CALL O
                WHERE E.ID = O.EMP_ID
                AND L.ID = O.LOC_ID
                AND O.ONCALL_DATE=TRUNC(SYSDATE)
                AND O.TEAM=:TEAM_SELECTOR
                AND L.ID = ' || v_location ||
                ' ORDER BY l.name asc
                ';  
            EXIT;

        END IF;

    END LOOP;
END;

1 ответ

Итак, я считаю, что проблема заключалась в том, что классический отчет, основанный на функции, выполняется до того, как переменные хоста (TEAM_SELECTOR) могут быть связаны, что вызывает ошибку. Мое решение этого состояло в том, чтобы изменить его на обычный классический отчет, основанный на запросе sql, который выполняется после привязки переменных хоста, потому что мне нужна была одна отдельная переменная, я создал элемент P1_LOCATION на этой странице, используя тот же запрос, ожидающий изменения "v_location" до P1_LOCATION. Теперь в элементе страницы P1_LOCATION я поместил процедуру, чтобы получить местоположение.

Код P1_LOCATION:

    DECLARE
        v_time INT;
        v_start_time int;
        v_end_time int;
        v_rownum int := 1;
        v_max_shifts int;
        v_location INT;
        v_P4_team_selector varchar2(30) := :TEAM_SELECTOR;
BEGIN

    select extract(hour from CAST(sysdate AS TIMESTAMP)) into v_time from dual;

    select count(*) into v_max_shifts from oncall_shift
        where team = v_P4_team_selector;

    FOR i IN 0..v_max_shifts
    LOOP

            select start_time into v_start_time from (select * from oncall_shift where team =v_P4_team_selector)
        where rownum = v_rownum;
            select end_time into v_end_time from (select * from oncall_shift where team =v_P4_team_selector)
        where rownum = v_rownum;
        v_rownum := v_rownum + 1;   

        if v_time >= v_start_time and v_time <= v_end_time
        then

                select location into v_location from oncall_shift
            where team = v_P4_team_selector
            and start_time = v_start_time
            and end_time = v_end_time;

            APEX_UTIL.set_session_state('P1_LOCATION',v_location);

            EXIT;

        END IF;

    END LOOP;
END;

Классический отчет (SQL-запрос):

SELECT E.FNAME "First Name",E.LNAME "Last Name",E.OFFICE_NUM "Office Number", E.MOBILE_NUM "Mobile Number",L.NAME Location, o.position "Primary/Secondary"
                FROM EMPLOYEE E, LOCATION L, ON_CALL O
                WHERE E.ID = O.EMP_ID
                AND L.ID = O.LOC_ID
                AND O.ONCALL_DATE=TRUNC(SYSDATE)
                AND O.TEAM=:TEAM_SELECTOR
                AND L.ID = :P1_LOCATION
                 ORDER BY l.name asc
Другие вопросы по тегам