2016-07-20 12 views
0

Ich habe eine SAP-HANA-Prozeduren, um eine Tabelle zu aktualisieren. Ich versuche, eine dynamische SQL-Abfrage zu erstellen, dies ist mein Beispiel ist:Dynamische Update-Abfrage mit Parametern in SAP-HANA-Prozeduren

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); 

Aber in der Konsole Ich habe diesen Fehler:

Service exception: [260] invalid column name

Wie kann ich es beheben?

Antwort

1

fand ich die richtige Syntax es

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); 

zu beheben Wenn ich eine Spalte oder Tabelle die richtige Syntax Name ist "'||_field||'"

setzen müssen, um die Syntax ist '''||_name||''' der erste einen String-Wert gesetzt Für das Escape werden zwei Apostrophe verwendet, sodass wir der Abfrage sagen können, dass der Wert eine Zeichenfolge ist und der letzte Apostroph zum Verketten des Werts mit dem Rest der Abfragezeichenfolge verwendet wird. Die drei Apostrophe müssen ohne Leerzeichen zwischen ihnen geschrieben werden.

+1

Während Sie den Syntaxfehler behoben haben, seien Sie sich bewusst, dass die Vorgehensweise, die Sie hier anwenden, wirklich "über" -flexibel ist und in SQL-Code von Programmierern verwendet wird, die in anderen Sprachen arbeiten. Zu den vielen Nachteilen dieses Ansatzes gehören: Code hat 'unsichtbare' Abhängigkeiten zu Ihrem Datenmodell, die Anweisungen können zur Kompilierzeit nicht überprüft werden, da die SQL-Injection stark verändert ist, wird der SQL-Cache durch einmalige Anweisungen überflutet. .. Erstellen Sie stattdessen spezifische Prozeduren, die für bestimmte Entitäten in Ihrer Datenbank gelten. –

+0

Ich kenne das große Problem dieses Ansatzes, aber aus vielen Gründen muss ich in diesem Fall diesen Weg wählen. Vielen dank für Deine Hilfe! – Shiroga