【发布时间】:2012-03-12 10:03:11
【问题描述】:
我正在尝试在 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;
【问题讨论】:
标签: function postgresql stored-procedures execute plpgsql