有人可以帮我为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).
我做错了什么?
答案 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