在Informix SQL查询中使用占位符

时间:2018-01-17 07:23:23

标签: sql database syntax informix

如果需要两次输入一个输入参数,我如何在动态SQL字符串中使用占位符?以下代码不起作用。

CREATE FUNCTION somefunc( p_name VARCHAR( 32 ), p_id INT, p_weight INT ) RETURNING INT;

    LET sp_id = 0;
    LET somearea=12;


    LET c_query ='SELECT FIRST 1 pr_id FROM sometable n WHERE n.pr_id> ? and n.pr_weight = ? ( UPPER( n.sname ) LIKE %UPPER(?))'||
    ' OR( UPPER(?) LIKE %UPPER( n.name)) ORDER BY 1, 2;';

    PREPARE c_stmt
    FROM c_query;

    DECLARE c_cur CURSOR FOR c_stmt;

    OPEN c_cur USING p_id, p_weight, p_name, p_name ;

    FETCH c_cur INTO sp_id;

    CLOSE c_cur;

    FREE c_cur;

    FREE c_stmt;

    RETURN sp_id;

END FUNCTION;

1 个答案:

答案 0 :(得分:2)

嗯......不太确定完全理解这个问题(或者SQL的目的,希望它是我们的测试,因为它在行动中看起来很奇怪)

无论如何,这是你的SPL语法正确:

D:\infx\ids12>cat 1.sql
DROP TABLE sometable;
CREATE TABLE sometable  (name varchar(32), sname varchar(32), pr_id int, pr_weight int);

INSERT INTO sometable VALUES ('test','test',1,100);
INSERT INTO sometable VALUES ('tESt','tESt',2,200);
INSERT INTO sometable VALUES ('another','another',3,300);

DROP FUNCTION somefunc;
CREATE FUNCTION somefunc( p_name VARCHAR( 32 ), p_id INT, p_weight INT ) RETURNING INT;
    DEFINE sp_id int;
        DEFINE c_query varchar(200);

    LET sp_id = 0;
        LET c_query ="SELECT FIRST 1 pr_id FROM sometable n WHERE n.pr_id> ? and n.pr_weight = ? and ( UPPER( n.sname ) LIKE UPPER('%'||?||'%')) OR( UPPER('%'||?||'%') LIKE UPPER( n.name)) ORDER BY 1";

    PREPARE c_stmt
    FROM c_query;
    DECLARE c_cur CURSOR FOR c_stmt;
    OPEN c_cur USING p_id, p_weight, p_name, p_name ;
    FETCH c_cur INTO sp_id;
    CLOSE c_cur;

    FREE c_cur;
    FREE c_stmt;
    RETURN sp_id;

END FUNCTION;

--SELECT FIRST 1 * FROM sometable n WHERE n.pr_id> 1 and n.pr_weight = 200 and ( UPPER( n.sname ) LIKE UPPER('%'||'TEST'||'%')) OR ( UPPER('%'||'TEST'||'%') LIKE UPPER( n.name)) ORDER BY 1;

EXECUTE FUNCTION somefunc('TEST',1,200);

D:\infx\ids12>dbaccess stores7 1.sql
Database selected.
Table dropped.
Table created.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
Routine dropped.
Routine created.
(expression)
           2
1 row(s) retrieved.
Database closed.
D:\infx\ids12>

我认为Jonathan在谈论动态SQL时所指的是你不需要在SPL中使用占位符(?)来构建或准备SELECT语句。你可以主要执行任何' SQL语句。 上面的SPL可以重写如下:

D:\infx\ids12>cat 2.sql
DROP FUNCTION somefunc_simple;

CREATE FUNCTION somefunc_simple( p_name VARCHAR( 32 ), p_id INT, p_weight INT )
RETURNING INT;
        DEFINE sp_id int;

        LET sp_id=(SELECT FIRST 1 pr_id  FROM sometable n WHERE n.pr_id> p_id and n.pr_weight = p_weight and ( UPPER( n.sname ) LIKE UPPER('%'||p_name||'%')) OR ( UPPER('%'||p_name||'%') LIKE UPPER( n.name)));

        RETURN sp_id;
END FUNCTION;

EXECUTE FUNCTION somefunc_simple('TEST',1,200);

D:\infx\ids12>dbaccess stores7 2.sql
Database selected.
Routine dropped.
Routine created.
(expression)

           2
1 row(s) retrieved.
Database closed.
D:\infx\ids12>

阅读

上的Informix SQL指南

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.sqls.doc/sqls.htm

它应该让您了解如何编写Informix SQL和SPL以及支持哪些功能。

此外,此处解释了动态SQL:

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.esqlc.doc/ids_esqlc_0528.htm