【问题标题】:Dynamic update query with parameters in SAP HANA proceduresSAP HANA 过程中带有参数的动态更新查询
【发布时间】:2016-07-20 08:40:42
【问题描述】:

我有一个 SAP HANA 程序来更新一个表。我正在尝试创建一个动态 sql 查询,这是我的示例:

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

但是在控制台我有这个错误:

服务异常:[260] 无效的列名

我该如何解决?

【问题讨论】:

    标签: sql stored-procedures sap hana dynamicquery


    【解决方案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||''',前两个撇号用于转义,因此我们可以对查询说该值是一个字符串,最后一个撇号用于将值连接到其余部分的查询字符串。三个撇号之间不能有空格。

    【讨论】:

    • 虽然您已修复语法错误,但请注意,您在此处采用的方法确实“过度”灵活,并且在过去使用其他语言的程序员编写的 SQL 代码中很常见.这种方法的许多缺点包括:代码对您的数据模型具有“不可见”的依赖关系,无法在编译时检查语句,SQL 注入的巨大变化,SQL 缓存将被一次性语句淹没。 . 而不是这样,而是构建适用于数据库中特定实体的特定过程。
    • 我知道这种方式的大问题,但是由于很多原因,在这种情况下,我不得不选择这种方式。非常感谢您的帮助!
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多