IBM Informix如何在参数中传递字符串值

时间:2018-01-16 08:42:58

标签: sql informix

有人可以帮我为Informix db创建正确的SQL查询吗? 我有一个函数,我正在尝试从字符串中准备SQL查询,如Informix docs中所述

CREATE FUNCTION somefunction( stringval VARCHAR( 32 )) RETURNING INT;
DEFINE c_query varchar(250);
LET c_query = 'select first 1 someid, somevalue from sometable where sname= '||stringval||' order by somevalue;
PREPARE c_stmt
FROM c_query;

DECLARE c_cur CURSOR FOR c_stmt;
OPEN c_cur ;
FETCH c_cur INTO sp_id ;
CLOSE c_cur;
FREE c_cur;
FREE c_stmt;
RETURN sp_id;
END FUNCION;

当我尝试测试它时,我按如下方式调用它:

SELECT * FROM table(functionname('fo'))

但不幸的是我收到了带有文字的错误消息:

Column (fo) not found in any table in the query (or SLV is undefined).

我做错了什么?

1 个答案:

答案 0 :(得分:3)

如果您想要与 T * const test = dynamic_cast<T*>(components[i].get()); if(test) { return test; } 名称对应的数字,则必须将其括在引号中,这反过来意味着您需要转义字符串中的引号。您需要阅读SQL Injection,因为您提出的建议非常容易受到SQL注入攻击。

如果练习的目的是要显示执行的查询,那么你应该使用:

fo

如果练习的对象是使用动态SQL,那么你应该考虑使用占位符,如下所示:

CREATE FUNCTION somefunction(stringval VARCHAR(32)) RETURNING INT;

    DEFINE sp_id INTEGER;

    SELECT FIRST 1 someid
      INTO sp_id
      FROM sometable
     WHERE sname= stringval
     ORDER BY somevalue;

    RETURN sp_id;

END FUNCTION

桌上未经测试。我测试的代码是:

CREATE FUNCTION somefunction(stringval VARCHAR(32)) RETURNING INT;

    DEFINE sp_id INTEGER;
    DEFINE c_query varchar(250);
    LET c_query = 'SELECT FIRST 1 someid FROM sometable WHERE sname = ? ORDER BY somevalue';
    PREPARE c_stmt FROM c_query;

    DECLARE c_cur CURSOR FOR c_stmt;
    OPEN c_cur USING stringval;
    FETCH c_cur INTO sp_id;
    CLOSE c_cur;
    FREE c_cur;
    FREE c_stmt;
    RETURN sp_id;

END FUNCTION

CREATE FUNCTION atomic_number(symbol VARCHAR(3)) RETURNING INTEGER;
    DEFINE num INTEGER;
    SELECT atomic_number INTO num FROM elements AS e WHERE e.symbol = symbol;
    RETURN num;
END FUNCTION

这些与元素表相对应。 (如&#39;周期表&#39;),结构:

CREATE FUNCTION atomic_number(symbol VARCHAR(3)) RETURNING INTEGER;
    DEFINE num INTEGER;
    DEFINE c_query varchar(250);
    LET c_query = 'SELECT FIRST 1 atomic_number FROM elements WHERE symbol = ? ORDER BY atomic_number';
    PREPARE c_stmt FROM c_query;

    DECLARE c_cur CURSOR FOR c_stmt;
    OPEN c_cur USING symbol;
    FETCH c_cur INTO num;
    CLOSE c_cur;
    FREE c_cur;
    FREE c_stmt;
    RETURN num;
END FUNCTION
相关问题