2014-01-09 2 views
0

Пока я просматриваю параметризованные представления, я столкнулся с следующим пакетом и представлением, которое имеет параметр deptno в качестве параметра.Почему мы не можем назначить переменную в предложении `where` в параметризованном представлении

CREATE OR REPLACE PACKAGE glb_variables 
IS 
    gv_deptno scott.emp.deptno%TYPE; 

    PROCEDURE set_deptno(deptno_in scott.emp.deptno%TYPE); 

    FUNCTION get_deptno RETURN scott.emp.deptno%TYPE; 
END; 
/

CREATE OR REPLACE PACKAGE BODY glb_variables 
IS 
    PROCEDURE set_deptno(deptno_in scott.emp.deptno%TYPE) IS 
    BEGIN 
     gv_deptno := deptno_in; 
    END; 

    FUNCTION get_deptno RETURN scott.emp.deptno%TYPE IS 
    BEGIN 
     RETURN gv_deptno; 
    END; 
END; 
/

CREATE OR REPLACE VIEW emp_in_dep AS 
    SELECT * 
    FROM scott.emp 
    WHERE deptno = glb_variables.get_deptno; 

В пункте where в представлении, когда я попытался непосредственно присвоить переменной. Я получаю следующую ошибку.

ORA-06553: PLS-221: 'GV_DEPTNO' is not a procedure or is undefined

Почему мы не можем присвоить переменной в операторе where?

+1

Ваша функция завернута в пакет. Поэтому назовите их как 'where deptno = glb_variables.get_deptno();' Я просто добавил фигурные скобки в конце – SriniV

+0

Я думаю, вам нужно быть более четким с вашей терминологией. Предложение WHERE определяет логический тест для фильтрации. Вы ничего не можете изменить внутри предложения WHERE. (Ну, может быть, с побочными эффектами, но если это работает, это настолько непредсказуемо, что вы не хотите этого делать.) – jpmc26

ответ

0

Миры PLSQL и SQL близки друг к другу, но не так близко. Переменные пакета нельзя использовать непосредственно в SQL. Вы должны использовать функцию, которая возвращает значение этой переменной.

Смежные вопросы