EXECUTE IMMEDIATE с предложением USING с ошибками - PullRequest
0 голосов
/ 17 июня 2009

All

Я очень плохо знаком с хранимыми процедурами в целом, но я особенно борюсь с теми, что в 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.

1 Ответ

1 голос
/ 17 июня 2009

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

Select col1 from table1 where col2 = :a

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

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...