相关疑难解决方法(0)

功能表现

来自 MySQL 背景,其中存储过程性能(旧文章)可用性值得怀疑,我正在评估 PostgreSQL 为我公司的新产品。

我想做的一件事是将一些应用程序逻辑移到存储过程中,所以我在这里询问有关在 PostgreSQL (9.0) 中使用函数的 DO 和 DON'T(最佳实践),特别是关于性能陷阱。

postgresql best-practices plpgsql

63
推荐指数
4
解决办法
4万
查看次数

用一个查询插入多个表

我想通过一个查询将数据添加到至少三个表中。我想到了这样的事情:

WITH ins AS (
  INSERT INTO core.adr
    (street, "number", postal_code, city)
  VALUES
    ('test 1', '25a', '00912', 'villageman')
  RETURNING id)
INSERT INTO core.adr_information
  (idref, info)
SELECT id, 'test data'
FROM ins;
Run Code Online (Sandbox Code Playgroud)

这完全适用于两个表。

这里的主要问题是,所有其他查询都需要id第一个INSERT查询的值,这似乎无法通过这种方式进行管理。我认为它可以通过存储过程或事务轻松完成,但我希望解决方案是一个简单而可靠的查询。

我是否忽略了什么?是否有可能以这种方式或另一种方式(没有存储过程*或事务)?


笔记

* Altough,严格来说,Postgres没有存储过程,只有功能,@Erwin Brandstetter修改正确地通过评论中指出。有关相关信息,请参阅本系列帖子

postgresql cte

12
推荐指数
1
解决办法
6万
查看次数

在 PostgreSQL 中,“存储过程”和其他类型的函数有什么区别?

我理解以下之间的区别:

  • 标量函数
  • 集合返回函数 (SRF)
  • 内部功能
  • 窗口函数
  • 各种聚合函数
  • 用户实现的函数(在 PostgreSQL 中可以用任何语言实现)
  • 等等。

在 SQL Server 中,“存储过程”允许通过EXEC. 与使用SELECT该返回执行的任何其他函数相比,它提供了什么NULL

当 PostgreSQL 获得存储过程时,它们会给我带来什么,规范中函数和存储过程之间的正式区别是什么?

我读过这个问题,但它似乎早于宣布实施

postgresql stored-procedures terminology functions sql-standard

9
推荐指数
2
解决办法
8324
查看次数

即使函数中止,也会在 UDF 中持久插入

我有一个相当复杂的 UDF(在一堆表中移动并创建一堆新表),其中可能会发生多次中止。在每次操作之前,我想记录操作发生的时间和查询本身。UDF 如下所示:

log function_start

log sql1
execute sql1

log sql2
execute sql2

...

log sqlN
execute sqlN

log function_end
Run Code Online (Sandbox Code Playgroud)

每条日志语句都意味着向下表中插入一条新记录:

CREATE TABLE backup_logs
(
  id serial NOT NULL,
  t timestamp with time zone default now(),
  sql text,
  CONSTRAINT backup_logs_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

如果发生中止,我希望sql1, sql2, ... sqlN回滚,但inserto into backup_logs会继续存在。问题:我怎样才能实现这一目标?

postgresql insert transaction plpgsql postgresql-9.4

5
推荐指数
1
解决办法
1076
查看次数

使用 PostgreSQL 函数而不是加入?

我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。

我有一个功能:

CREATE OR REPLACE FUNCTION get_name(user_id UUID) RETURNS TEXT AS $$
    SELECT username
    FROM   users
    WHERE  users.id=user_id
$$ LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)

我喜欢使用这个函数在其他查询中从 user_id 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?

我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?

编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?

postgresql best-practices functions

3
推荐指数
1
解决办法
204
查看次数

如何在过程(不是函数)中使用变量?

据我了解,在 Postgres 中,过程用于操作数据,函数用于读取数据。我想要:

  1. 声明一个变量
  2. 选择一个值到一个变量中
  3. 将变量插入另一个表
  4. 在事务中执行此操作
  5. 在存储过程中执行此操作
  6. 必要时回滚

CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
    BEGIN;
        DECLARE some_id INTEGER;
        SELECT nextval('some_sequence') INTO some_id;
        INSERT INTO some_table (some_column) VALUES (some_id);
    END;
$$;
Run Code Online (Sandbox Code Playgroud)

以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。

postgresql transaction plpgsql functions sql-procedure

3
推荐指数
1
解决办法
9629
查看次数