oracle dynamic sql с использованием параметров со скобками в качестве имени таблицы
В моей схеме есть таблица с квадратными скобками в названии (это устаревшая версия, которую нельзя изменить):
CREATE TABLE "Addresses"
("ID" NUMBER(*,0) ,
"FullAddress" NVARCHAR2(100),
"HomeNum" NVARCHAR2(25),
"StreetName" NVARCHAR2(50)
)
Так что я хочу иметь возможность обновлять эту таблицу с помощью динамического SQL. Вот как я пытаюсь это сделать:
DECLARE
sql_upd_statement VARCHAR2(500) := '';
table_name VARCHAR2(20) := '"Addresses"';
column_name VARCHAR2(20) := '"FullAddress"';
BEGIN
--no rows will be updated, just a sample
sql_upd_statement := 'UPDATE stm.:1 SET :2 = SUBSTR( :2, 2 ) WHERE :2 IS NOT NULL AND :2 IS NULL';
dbms_output.put_line( sql_upd_statement );
EXECUTE IMMEDIATE sql_upd_statement USING IN table_name, column_name;
END;
Пожалуйста, скажите, возможно ли достичь того, что я хочу, через динамический sql? Попытался установить значения 'table_name', 'column_name' без скобок - все равно не повезло.
1 ответ
Решение
Имена объектов схемы нельзя передавать с помощью переменных связывания, они должны быть литералами.
sql_upd_statement := 'UPDATE stm.'||table_name||' SET '||column_name||' = SUBSTR( '||column_name||', 2 ) WHERE '||column_name||' IS NOT NULL AND '||column_name||' IS NULL';