ВЫПОЛНИТЬ НЕМЕДЛЕННО с ИСПОЛЬЗОВАНИЕМ предложения, выдающего ошибки

StackOverflow https://stackoverflow.com/questions/1008816

Вопрос

Все,

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

Пример хранимой процедуры выглядит следующим образом:

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

Когда я вызываю описанную выше хранимую процедуру, используя CALL ashish_test(), Я получаю :

Сообщение об ошибке http://web1.twitpic.com/img/12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

Основанный на эта статья (Посмотрите на пример 7-1), USING ключевое слово должно заменить пронумерованный заполнитель (:1) в пределах v_strSQL со значением, хранящимся в v_tab.Однако я продолжаю получать ошибку недопустимой таблицы.Я предполагаю, что это потому, что EXECUTE IMMEDIATE по какой-то причине не удается заменить заполнитель значением, но я не уверен, почему это так.Кто-нибудь знает, не делаю ли я здесь какую-нибудь глупость?

Я запускаю это в базе данных Oracle 10g и использую PL / SQL Developer.

Это было полезно?

Решение

Предложение USING предназначено только для переменных привязки (т.е.где вы бы использовали имена столбцов в инструкции select), а не имена таблиц.Типичное использование будет выглядеть следующим образом:

Select col1 from table1 where col2 = :a

Если вы хотите использовать имена таблиц переменных, используйте что-то вроде этого:

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top