执行 SELECT 语句并丢弃 PL/pgSQL 中的结果
Posted
技术标签:
【中文标题】执行 SELECT 语句并丢弃 PL/pgSQL 中的结果【英文标题】:Execute a SELECT statement and discard results in PL/pgSQL 【发布时间】: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;
【问题讨论】:
【参考方案1】:您需要PERFORM
“在 postgresql 存储过程中执行 SELECT 语句而不需要返回其结果”。
否则你的问题是PL/pgSQL的命令EXECUTE
与SQL命令EXECUTE
不同。
【讨论】:
以上是关于执行 SELECT 语句并丢弃 PL/pgSQL 中的结果的主要内容,如果未能解决你的问题,请参考以下文章
重构 PL/pgSQL 函数以返回各种 SELECT 查询的输出
PL/PGSQL - 无法将 SELECT 语句中的 array_agg 分配给变量
如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?