如何在不创建函数的情况下运行plpgsql?

时间:2016-07-13 15:18:40

标签: postgresql plpgsql

我想在不创建函数的情况下以编程方式在Postgres中运行SQL。

原因:确保我的plpgsql事先工作并且解释分析"将查询提交给函数之前的查询。

我是Postgres的新手,我觉得这很简单。我在那里找不到任何例子。也许这不可能吗?下面的代码如何工作?

gameBoard

同样,这里的目标是测试我的SQL,就像在这种情况下我想确保我的CASE语句仍然使用我创建的索引(LOWER(name_short))。无论如何,我收到此错误消息:

  

错误:无法在非SETOF函数中使用RETURN QUERY

我在Postgres中提出的问题是什么?如果没有,有没有办法在函数内查询分析计划?

3 个答案:

答案 0 :(得分:3)

匿名代码块返回void。但是,您可以使用临时表的技巧,例如

public class ServiceBusQueueService : IQueueService<SbMessage>
{
    private readonly QueueClient _client;

    public ServiceBusQueueService(string queueName)
    {
        var connectionString = ConfigurationManager.AppSettings.Get("ServiceBus.ConnectionString");

        // When executes this line, it throws an exception
        _client = QueueClient.CreateFromConnectionString(connectionString, queueName);
    }
  }

使用CREATE TEMP TABLE IF NOT EXISTS trace (name_short text, name_long text); DO $body$ DECLARE v_name_short VARCHAR; BEGIN v_name_short := 'test Account 1'; INSERT INTO trace SELECT a.name_short, a.name_long FROM enterprise.account a WHERE CASE WHEN v_name_short IS NOT NULL THEN LOWER(a.name_short) = LOWER(v_name_short) ELSE 1 = 1 END; END; $body$ LANGUAGE 'plpgsql'; SELECT * FROM trace; -- DROP TABLE trace; ,您只能分析一个简单的SQL查询,而不是一个函数,一个do块或一个脚本。所以你可以尝试:

EXPLAIN ANALYSE

请注意,在这种情况下,您无法使用变量beacuse,它不会被规划者识别,而是使用文字。

答案 1 :(得分:1)

常规PL / pgSQL函数和DO语句之间有第三个(未记录的)选项:临时函数

实际上 可以使用附加模块auto-explain获取plpgsql函数内每个SQL语句的详细查询计划。详细说明:

但是您必须使用CASE表达式中每个分支的值测试您的函数,以确保涵盖所有内容。 Postgres只对CREATE FUNCTION进行表面语法检查。

Prepared statements可能是另一种选择。 PL / pgSQL在内部处理类似预准备语句的SQL语句:

答案 2 :(得分:0)

do匿名代码块始终返回void

  

代码块被视为没有参数的函数体,返回void

要在do块内执行查询,请使用perform

do $$
    begin
    perform * from t;
    end
$$;

https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-NORESULT