问题:我在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
有人能告诉我哪里出错了吗?最好只需要更改变量中的数字,而不是脚本中的所有行,而我似乎无法弄明白。
答案 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);