select和delete语句中的PostgreSQL变量

时间:2017-11-01 17:59:52

标签: sql postgresql variables

问题:我在PostgreSQL脚本中有很多删除行,我删除了与数据库中相同项目相关的数据。例如:

delete from <table> where <column>=180;
delete from <anothertable> where <column>=180;
...
delete from <table> where <column>=180;
commit work;

大约有15个删除语句删除引用<column>=180的数据。

我试图用变量替换180,这样我只需要更改变量,而不是代码中的所有行(就像任何优秀的程序员一样)。我似乎无法弄清楚如何做到这一点,而且它无法正常工作。

注意:我非常喜欢SQL新手(我很少使用它),所以我知道可能有更好的方法来做到这一点,但请告诉我如何解决这个问题。

我已经使用这些答案尝试修复它而没有运气:first second third。我甚至没有运气就去了the official PostgreSQL documentation

这就是我正在尝试的(这些行仅用于测试,而不是在实际脚本中):

DO $$
DECLARE
    variable INTEGER:
BEGIN
    variable := 101;
    SELECT * FROM <table> WHERE <column> = variable;
END $$;

我也试过像这样说道:

DECLARE variable INTEGER := 101;

每当我用变量替换其中一个数字后运行脚本时,这就是我得到的错误:

SQL Error [42601]: ERROR: query has no destination for result data
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Where: PL/pgSQL function inline_code_block line 6 at SQL statement

有人能告诉我哪里出错了吗?最好只需要更改变量中的数字,而不是脚本中的所有行,而我似乎无法弄明白。

1 个答案:

答案 0 :(得分:3)

正如@Vao Tsun所说,你必须为你的SELECT声明定义一个目的地。否则使用PERFORM

--Test data
CREATE TEMP TABLE my_table (id, description) AS 
    VALUES (1, 'test 1'), (2, 'test 2'), (101, 'test 101');

--Example procedure
CREATE OR REPLACE FUNCTION my_procedure(my_arg my_table) RETURNS VOID AS $$
BEGIN
    RAISE INFO 'Procedure: %,%', my_arg.id, my_arg.description;
END
$$ LANGUAGE plpgsql;

DO $$
DECLARE
    variable INTEGER;
    my_record my_table%rowtype;
BEGIN
    variable := 101;

    --Use your SELECT inside a LOOP to work with result   
    FOR my_record IN SELECT * FROM my_table WHERE id = variable LOOP
        RAISE INFO 'Loop: %,%', my_record.id, my_record.description;
    END LOOP;

    --Use SELECT to populate a variable. 
    --In this case you MUST define a destination to your result data
    SELECT * INTO STRICT my_record FROM my_table WHERE id = variable;   
    RAISE INFO 'Select: %,%', my_record.id, my_record.description;

    --Use PERFORM instead of SELECT if you want to discard result data
    --It's often used to call a procedure 
    PERFORM my_procedure(t) FROM my_table AS t WHERE id = variable;

END $$;

--DROP FUNCTION my_procedure(my_table);