Это продолжение вопроса Винсента Малграта на этот вопрос . Я не могу найти правильный синтаксис для использования, когда вам нужно использовать одну и ту же переменную связывания несколько раз при использовании OPEN...FOR
dynamici c SQL. Вы можете увидеть синтаксис для EXECUTE IMMEDIATE
здесь (см. «Использование дублирующих заполнителей с Dynami c SQL»)… но не для OPEN...FOR
. Различается ли синтаксис с дубликатами-заполнителями при использовании OPEN...FOR
? Я использую Oracle 12 c. Это в пакете PL / SQL, а не в анонимном блоке.
Например, этот пример из собственной документации Oracle работает нормально:
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
emp_cv EmpCurTyp;
emp_rec emp%ROWTYPE;
sql_stmt VARCHAR2(200);
my_job VARCHAR2(15) := 'CLERK';
BEGIN
sql_stmt := 'SELECT * FROM emp WHERE job = :j';
OPEN emp_cv FOR sql_stmt USING my_job;
LOOP
FETCH emp_cv INTO emp_rec;
EXIT WHEN emp_cv%NOTFOUND;
-- process record
END LOOP;
CLOSE emp_cv;
END;
/
Но если вам нужно чтобы ссылаться на переменную связывания :j
более одного раза, как вы делаете это в таком случае, когда на :j
ссылаются дважды?
sql_stmt := 'SELECT * FROM emp WHERE (job = :j AND name = :n) OR (job = :j AND age = :a)' ;
Я пытался
OPEN emp_cv FOR sql_stmt USING my_job, my_name, my_age;
и
OPEN emp_cv FOR sql_stmt USING my_job, my_name, my_age, my_job;
и в обоих случаях выдает эту ошибку:
ORA-01008: not all variables bound