ВЫПОЛНИТЬ НЕМЕДЛЕННО с ИСПОЛЬЗОВАНИЕМ предложения, выдающего ошибки
-
06-07-2019 - |
Вопрос
Все,
Я очень новичок в хранимых процедурах в целом, но особенно мне трудно работать с теми, что есть в 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()
, Я получаю :
Основанный на эта статья (Посмотрите на пример 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;