我试图在PostgreSQL中创建一个简单的存储过程,我想在其中执行SELECT语句。我不想返回select语句的结果。
如果我直接使用select语句,如下面的代码,我收到一条错误,说“查询没有结果数据的目的地”
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
SELECT * FROM testing.csv_data_already_imported;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
因此我使用PREPARE .. EXECUTE语句如下:
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
EXECUTE fooplan;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
使用此方法仍然会给我错误:
ERROR: column "fooplan" does not exist
LINE 1: SELECT fooplan
^
QUERY: SELECT fooplan
CONTEXT: PL/pgSQL function "returning_affected_rows" line 8 at EXECUTE statement
任何人都可以帮我理解错误吗?存储过程声明为plpgsql函数,这意味着EXECUTE命令不应该被视为执行动态SQL语句的标准SQL命令。我想知道的是如何在PostgreSQL存储过程中执行SELECT语句而无需返回其结果。存储过程的完整DDL如下:
CREATE OR REPLACE FUNCTION testing.returning_affected_rows ()
RETURNS integer AS
$body$
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
EXECUTE fooplan;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;