PLPGSQL中带引号的游戏

问题描述 投票:1回答:1

我(仍然)要求您的帮助。我有一个PLPGSQL脚本,其骨架很好。在此基础上,我有6个脚本可以正常工作。但是,我有一个稍微复杂一些的第7个脚本。

CREATE or replace FUNCTION maFonction(table_ori varchar, annee_millesime varchar, annee_purge varchar) RETURNS void AS $$
    DECLARE
        MOIS_MM         varchar := to_char(current_timestamp, 'MM');
        ANNEE_AAAA      varchar := to_char(current_timestamp, 'YYYY');
        ANNEE_AA        varchar := to_char(current_timestamp, 'YY');

        cmd_create      varchar := 'CREATE TABLE ' || table_ori || '_' || annee_millesime || ' AS TABLE ' || table_ori || ' WITH NO DATA;';
        cmd_drop        varchar := 'DROP TABLE IF EXISTS ' || table_ori || '_' || annee_purge ||';';
        cmd_copie_suppr varchar := 'WITH tmp AS ( DELETE FROM ' || table_ori || ' WHERE SUBSTR(numprel, 1, 2) != ' || ANNEE_AA ||' RETURNING *) INSERT INTO ' || table_ori || '_' || annee_millesime || ' SELECT * FROM tmp ;';

    BEGIN
        execute cmd_create;
        execute cmd_copie_suppr;            
        execute cmd_drop;
    END;
$$ LANGUAGE plpgsql;

如您所见,在我的SQL查询中,我使用WHERE条件。但是,后者必然要求'(引号)考虑该值。但是这个值对我来说是一个变量。这是我在上面的代码中得到的错误

psql:./myscript.sql:66: ERROR:  operator does not exist: text <> integer
LINE 1: ...schema.table WHERE SUBSTR(numprel, 1, 2) != 20 RETU...
                                                    ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY:  WITH tmp AS ( DELETE FROM schema.table WHERE SUBSTR(numprel, 1, 2) != 20 RETURNING *) INSERT INTO dschema.table_2019 SELECT * FROM tmp ;
CONTEXT:  PL/pgSQL function mafonction(character varying,character varying,character varying) line 20 at EXECUTE statement

如何使此变量ANNEE_AA的值正确且介于'(引号)之间以发出正确的请求?

plpgsql postgresql-9.4 quote
1个回答
0
投票

使用format使事情变得简单:

format

CREATE or replace FUNCTION maFonction(table_ori varchar, annee_millesime varchar, annee_purge varchar) RETURNS void AS $$ DECLARE MOIS_MM varchar := to_char(current_timestamp, 'MM'); ANNEE_AAAA varchar := to_char(current_timestamp, 'YYYY'); ANNEE_AA varchar := to_char(current_timestamp, 'YY'); cmd_create varchar := format('CREATE TABLE %I AS TABLE %I WITH NO DATA', table_ori || '_' || annee_millesime, table_ori); cmd_drop varchar := format('DROP TABLE IF EXISTS %I ', table_ori || '_' || annee_purge); cmd_copie_suppr varchar := format( 'WITH tmp AS ( DELETE FROM %I WHERE SUBSTR(numprel, 1, 2) <> %L RETURNING * ) INSERT INTO %I SELECT * FROM tmp', table_ori, annee_aa, table_ori || '_' || annee_millesime); BEGIN execute cmd_create; execute cmd_copie_suppr; execute cmd_drop; END; $$ LANGUAGE plpgsql; 插入一个标识符(必要时适当地双引号),%I插入一个带有单引号的字符文字(必要时使用转义的嵌入式单引号)。

© www.soinside.com 2019 - 2024. All rights reserved.