我正在尝试在 Heroku 数据库上创建一个函数。我最终会把它绑在触发器上。
我已经看到了这个错误,但我似乎找不到解决方法。
我得到的错误是...
rake aborted!
PG::Error: ERROR: language "plpgsql" does not exist
Run Code Online (Sandbox Code Playgroud)
我读到的是我无法在 Heroku 上创建触发器或函数。除非我使用shared_database,这不是一个选项。我的应用程序已经是多租户的,并且使用它自己的架构。
我尝试按照建议创建语言,但遭到拒绝。
问题:我没看错吗?可以在 Heroku 上的 postgesql 中创建函数吗?
问题:如果可以在数据库中创建函数,那么有人知道如何实现吗?
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) 我正在将一些客户端内容迁移到服务器中,并希望将其放入一个函数中。
我需要将查询结果存入 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”,并且它不知道该怎么做。
如果需要的话,我可以对路径进行硬编码,但是能够将其作为参数传递肯定会很方便。
有人有任何线索吗?
我非常喜欢用 Java 编写数据库端代码,但想知道这样做与 pl/pgsql 相比是否有任何缺点(特别是与性能和错误处理相关的)。
这是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)
但该函数会为每一列调用一次。
给定一个数组,如何在 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 的组合,并且每次尺寸增加都需要一个额外的交叉连接,这显然不切合实际。
我有一张桌子。我在 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 中创建一个以表名作为参数的函数,该函数返回作为查询“select * from TABLE”的参数传递的表的结果集。这里的 TABLE 是传递给函数的参数。
我有一个简单的任务是将巨大的 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语句中?
我正在尝试从共享相同 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) plpgsql ×10
postgresql ×10
arrays ×2
sql ×2
triggers ×2
combinations ×1
copy ×1
csv ×1
dynamic-sql ×1
function ×1
heroku ×1
join ×1
nextval ×1
pljava ×1
sql-insert ×1