标签: plpgsql

在heroku上的postgresql数据库中创建一个函数

我正在尝试在 Heroku 数据库上创建一个函数。我最终会把它绑在触发器上。

我已经看到了这个错误,但我似乎找不到解决方法。

我得到的错误是...

rake aborted!
PG::Error: ERROR:  language "plpgsql" does not exist
Run Code Online (Sandbox Code Playgroud)

我读到的是我无法在 Heroku 上创建触发器或函数。除非我使用shared_database,这不是一个选项。我的应用程序已经是多租户的,并且使用它自己的架构。

我尝试按照建议创建语言,但遭到拒绝。

问题:我没看错吗?可以在 Heroku 上的 postgesql 中创建函数吗?
问题:如果可以在数据库中创建函数,那么有人知道如何实现吗?

postgresql ruby-on-rails function heroku plpgsql

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

PostgreSQL 触发器 RAISE EXCEPTION 适用于 INSERT 但不适用于 UPDATE

attribute_group_attribute.default_value我在 PostgreSQL 9.3 中定义了一个触发器,它根据 的值检查 的长度attribute_type.max_length


CREATE OR REPLACE FUNCTION trigger_function()
  RETURNS trigger AS 
$BODY$
DECLARE
    is_longer_than_max_length BOOLEAN;
BEGIN
    IF (NEW.default_value IS NOT NULL) THEN
        SELECT length(NEW.default_value) > attribute_type.max_length 
        INTO is_longer_than_max_length FROM attribute_group_attribute 
        JOIN attribute ON NEW.attribute_id = attribute.id JOIN attribute_type 
        ON attribute.attribute_type_id = attribute_type.id;

        IF (is_longer_than_max_length) THEN
            RAISE EXCEPTION 'Attribute type with id % has max length of %, 
            while attribute default value % has a length of %.', 
            attribute_type.id, attribute_type.max_length, NEW.default_value,
            length(NEW.default_value) USING ERRCODE='20808';
        END …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers plpgsql

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

Postgres PL/pgSQL 函数结果到文件,以文件名作为参数

我正在将一些客户端内容迁移到服务器中,并希望将其放入一个函数中。

我需要将查询结果存入 CSV 文件中。但是,我想将结果文件的文件名/位置作为函数的参数传递。

所以,这是我想做的一个简单的例子:

CREATE FUNCTION send_email_results(filename1 varchar) RETURNS void AS $$
DECLARE
BEGIN
    COPY(SELECT * FROM mytable) TO filename1 WITH CSV;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

Postgres 对此有所抱怨,因为它将 filename1 参数转换为“$1”,并且它不知道该怎么做。

如果需要的话,我可以对路径进行硬编码,但是能够将其作为参数传递肯定会很方便。

有人有任何线索吗?

sql csv postgresql copy plpgsql

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

Postgres pl/java 警告

我非常喜欢用 Java 编写数据库端代码,但想知道这样做与 pl/pgsql 相比是否有任何缺点(特别是与性能和错误处理相关的)。

postgresql plpgsql pljava

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

使用数组参数多次调用设置返回函数

这是plpgsql 函数的一个变体,它返回多个列,并被多次调用。然而,我希望找到针对我的特殊情况的解决方案。

我有一个函数,它处理具有给定参数的行数组,并返回一组行+一个新列。

CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...
Run Code Online (Sandbox Code Playgroud)

该函数适用于只有一组数据的测试用例

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 
Run Code Online (Sandbox Code Playgroud)

但我想让它处理多组数据,而不将 a 传递dataid给函数。我尝试了多种变体:

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid
Run Code Online (Sandbox Code Playgroud)

但该函数会为每一列调用一次。

sql postgresql join plpgsql set-returning-functions

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

如何在postgresql中查找任意大小的数组的所有组合(子集)

给定一个数组,如何在 postgresql 中查找特定大小的元素的所有组合(子集)。例如,给定一个数组 [1, 2, 3, 4],大小为 3 的所有组合都是

[1, 2, 3],
[1, 2, 4],
[1, 3, 4],
[2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

组合中的顺序并不重要,因此 [1, 2, 3] 和 [3, 2, 1] 被视为相同的组合。

更新: 所需组合的大小必须在运行时指定为参数,以便可以使用相同的函数/查询来查找任何大小 n <= 数组大小的组合。现有的解决方案仅适用于尺寸 3 的组合,并且每次尺寸增加都需要一个额外的交叉连接,这显然不切合实际。

arrays postgresql combinations plpgsql

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

在 PL/pgSQL 中 INSERT 后获取默认序列值

我有一张桌子。我在 plpgsql 中编写了一个函数,将一行插入到该表中:

INSERT INTO simpleTalbe (name,money) values('momo',1000) ;
Run Code Online (Sandbox Code Playgroud)

该表有serial一个名为 的字段id。我希望在插入行后在函数中知道新行收到的 id。

我想使用:

select nextval('serial');
Run Code Online (Sandbox Code Playgroud)

在插入之前,有没有更好的解决方案?

postgresql plpgsql nextval sql-insert sql-returning

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

postgresql 中以表名作为参数的函数

如何在 postgresql 中创建一个以表名作为参数的函数,该函数返回作为查询“select * from TABLE”的参数传递的表的结果集。这里的 TABLE 是传递给函数的参数。

postgresql plpgsql stored-functions

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

如何在触发器函数中将 NEW.* 传递给 EXECUTE

我有一个简单的任务是将巨大的 MD5 值插入到表(分区表)中,并创建了一个触发器和一个触发器函数来代替INSERT操作。在函数中,我检查了前两个字符NEW.md5以确定应插入哪个表。

DECLARE
  tb text;
BEGIN
  IF TG_OP = 'INSERT' THEN
    tb = 'samples_' || left(NEW.md5, 2);
    EXECUTE(format('INSERT INTO %s VALUES (%s);', tb, NEW.*)); <- WRONG
  END IF;
  RETURN NULL;
END;
Run Code Online (Sandbox Code Playgroud)

问题是如何连接NEW.*到SQL语句中?

postgresql triggers dynamic-sql plpgsql

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

如何在 postgres 的 where 子句中调用声明的数组变量?

我正在尝试从共享相同 family_id 的所有狗构建一个声明的数组,并使用该数组查询 dog_characteristics 表。

CREATE OR REPLACE FUNCTION update_dog_characteristics_guarantor_id()
  RETURNS trigger AS $$
  DECLARE dog_ids INT[];

  BEGIN
    SELECT id into dog_ids FROM dogs WHERE dogs.family_id = OLD.id;
    IF ((OLD.family_id IS NOT NULL) && ((SELECT COUNT(*) FROM dog_ids) > 0)) THEN
      UPDATE
        dog_characteristics
      SET
        guarantor_id = NEW.guarantor_id
      WHERE
        dog_characteristics.account_id = OLD.account_id
        AND dog_characteristics.dog_id IN ANY(dog_ids);
      RETURN NULL;
    END IF;
    RETURN NULL;
  END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我试过的

 AND dog_characteristics.dog_id = ANY(dog_ids);
 AND dog_characteristics.dog_id = ANY(dog_ids::int[]);
 AND dog_characteristics.dog_id IN (dog_ids::int[]);
 AND dog_characteristics.dog_id …
Run Code Online (Sandbox Code Playgroud)

arrays postgresql plpgsql

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