2016-07-20 1 views
0

У меня есть процедуры SAP HANA для обновления таблицы. Я пытаюсь создать динамический SQL-запрос, это мой пример:Запрос динамического обновления с параметрами в процедурах SAP HANA

declare _field varchar(100) := 'NAME'; 
declare _name varchar(100) := 'david'; 
declare _id integer := 1; 
DECLARE SQL_STR VARCHAR(3000); 

SQL_STR := 'UPDATE "_SYS_BIC"."TEST_TABLE" SET "'||_field||'" = '||_name||' WHERE "ID" = '||:_id; 

EXECUTE IMMEDIATE (:SQL_STR); 

Но в консоли у меня есть эта ошибка:

Service exception: [260] invalid column name

Как я могу это исправить?

ответ

1

Я нашел правильный синтаксис, чтобы исправить это

declare _id integer := 1; 
declare _name varchar(100) := 'david'; 
declare _field varchar(100) := 'NAME'; 
DECLARE SQL_STR VARCHAR(3000); 

SQL_STR := 'UPDATE "_SYS_BIC"."TEST_TABLE" SET "'||_field||'" = '''||_name||''' WHERE "ID" = '||_id; 
EXECUTE IMMEDIATE (:SQL_STR); 

Если я должен установить столбец или таблицу имя правильного синтаксиса является "'||_field||'"

Чтобы установить значение строки синтаксиса является '''||_name||''' первым для ускорения используются два апострофа, поэтому мы можем сказать запросу, что это значение является строкой, последний апостроф используется для объединения значения в остальную часть строки запроса. Три апострофа должны быть написаны без пробелов между ними.

+1

Хотя вы исправили ошибку синтаксиса, имейте в виду, что подход, который вы здесь делаете, действительно «сверх» - гибкий и общий вид в коде SQL, написанный программистами, используемыми для работы на других языках. Среди многих недостатков такого подхода: код имеет «невидимые» зависимости от вашей модели данных, операторы не могут быть проверены во время компиляции, есть большое изменение SQL-инъекции, SQL-кеш будет затоплен одноразовыми операциями. .. Вместо этого скорее создайте конкретные процедуры, которые работают с определенными объектами в вашей базе данных. –

+0

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