我尝试为 postgresql 8.3 创建一个 plpgsql 触发器,它在通过 id 列插入之前自动对表进行分区
如果目标表不存在,它将被创建,然后插入到那里
所以我用这样的新表名创建了插入语句
exec_insert := 'INSERT INTO '||TG_TABLE_SCHEMA||'.'||TG_RELNAME||'_'||destinationid||' VALUES('||NEW.*||')';
EXECUTE exec_insert;
Run Code Online (Sandbox Code Playgroud)
导致错误:
ERROR: NEW used in query that is not in a rule
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
谢谢
我正在尝试将 java 中的函数转换为 pl/pgsql,我发现的一个问题是当我尝试对 2 个负数求和并得到一个正数时,更具体地说:
public void sum(){
int n1 = -1808642602;
int n2 = -904321301;
System.out.println(n1 + n2);// result is 1582003393
}
Run Code Online (Sandbox Code Playgroud)
在 pl/pgsql 中,我得到一个整数超出范围错误,如果我将变量类型更改为 bigint,我会得到 2 个负数的正常总和,即 -2712963903,而不是 1582003393
如何在不打印整数超出范围错误的情况下获得相同的结果 pl/pgsql?
我在数据库中有这个程序:
CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$
BEGIN
INSERT INTO pageRelevance VALUES (id,value);
EXCEPTION WHEN unique_violation THEN
UPDATE pageRelevance SET relevance = value WHERE pageId = id;
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
以及调用此函数的这段代码:
try (CallableStatement cstm = conn.prepareCall(PAGE_RELEVANCE_SQL)) {
for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) {
cstm.setInt(1, entry.getKey());
cstm.setDouble(2, entry.getValue());
cstm.addBatch();
}
cstm.executeBatch();
} catch (SQLException e) {
LOGGER.error("Error discovering pages relevance: " + e.getNextException());
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,我收到一个错误通知function replacepagerelevance(integer, double precision) doesn't exists.。为什么? …
我有一个在 postgres 中执行 plpgsql 函数的 cron 作业。此函数将零到多条记录插入表中。返回由函数创建的记录作为结果的最佳方法是什么?
我正在使用 PostgreSQL 9.1
在这里,我试图连接一个字符串,:
CREATE FUNCTION looping() RETURNS TABLE(round text)
DECLARE
i RECORD;
BEGIN
FOR i IN select regexp_split_to_table('33,55,66,88', ',') as "asd"
LOOP
str:= str || ',' ||(select i."asd");
END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
这是真的还是我错过了什么?
问题是我需要运行一个查询(仅在运行时知道)来确定我的函数的输入参数,它需要返回一个结果。例如,我想写:
CREATE FUNCTION foo(inputKey INT) RETURNS TABLE (c0 INT, c1 TEXT) AS $$
BEGIN
-- Do something with inputKey to compute and return result
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
这些是我迄今为止尝试过的查询:
-- Doesn't even run (exception)
SELECT * FROM foo(SELECT foreignKey FROM someTable WHERE primaryKey = 5);
-- Runs, but returns a single column with all columns listed in it's value
SELECT foo(foreignKey) FROM someTable WHERE primaryKey = 5;
-- Same problem as previous
SELECT * FROM (SELECT foo(foreignKey) FROM someTable WHERE …Run Code Online (Sandbox Code Playgroud) 我想跟踪函数内的执行时间。例如,我有以下状态跟踪表:
CREATE TABLE status_table
(
run_id numeric NOT NULL,
start_ts timestamp(6) without time zone NOT NULL,
end_ts timestamp(6) without time zone NOT NULL
)
WITH (
OIDS=FALSE
)
DISTRIBUTED RANDOMLY;
Run Code Online (Sandbox Code Playgroud)
我有以下示例函数,它使用 PG_SLEEP(5) 作为对我的函数实际执行操作的模拟:
CREATE OR REPLACE FUNCTION wrapper_func(p_run_id numeric)
RETURNS numeric AS
$BODY$
Declare
tmp_start_ts timestamp(6) without time zone;
tmp_end_ts timestamp(6) without time zone;
BEGIN
tmp_start_ts := CURRENT_TIMESTAMP;
PERFORM PG_SLEEP(5);
tmp_end_ts := CURRENT_TIMESTAMP;
INSERT INTO status_table (run_id,start_ts,end_ts) VALUES (p_run_id,tmp_start_ts,tmp_end_ts);
RETURN 0;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)
I then called this …
快速背景:PostgreSQL 非常新,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问题,但仍然找不到解决方案。
我有这个选择语句,我每周执行一次以返回新值
select distinct id, null as charges
, generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)
Run Code Online (Sandbox Code Playgroud)
我能做些什么来把它变成一个我可以右键单击并每周执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此,它将在没有用户参与的情况下执行并将结果以电子表格的形式发送给用户。不确定最后一部分是否对函数的编写方式很重要。
这是我多次失败的尝试之一:
CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
, chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
, generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE …Run Code Online (Sandbox Code Playgroud) PostgreSQL 9.3手册描述了这个命令
'GET DIAGNOSTICS int_var = ROW_COUNT;'
Run Code Online (Sandbox Code Playgroud)
从最后一个insert/update命令获取受影响行的计数.当我在GUI(pgAdmin 3,SQL编辑器窗格)和Python(使用psycopg2包)中尝试此操作时,我收到此错误:
ERROR: syntax error at or near "GET".
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我一直试图在postgres中循环一个对象数组.但是,我反复收到错误error: could not determine polymorphic type because input has type "unknown".我认为这与我传递给看起来像这样的函数的值有关.
[
{
"number": 1,
"letter": "a"
},
{
"number": 2,
"letter": "b"
}
]
Run Code Online (Sandbox Code Playgroud)
功能如下.我已经制作了类型ANYARRAY,我认为它应该完全按照名称暗示.我不介意有更具体的选择.
CREATE OR REPLACE FUNCTION "CheckArrayOfObjects" (
"@arrayOfObjects" ANYARRAY
)
RETURNS void AS
$func$
DECLARE "e" JSONB;
BEGIN
FOR "e" IN json_array_elements("@arrayOfObjects")
LOOP
RAISE NOTICE 'Checking Item %', "e";
END LOOP;
END;
$func$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
我也尝试过FOREACH,但它并没有更好.我认为问题在于传入的值,所以不确定修改循环是否会做任何事情.
plpgsql ×10
postgresql ×9
sql ×4
java ×2
arrays ×1
function ×1
inheritance ×1
json ×1
jsonb ×1
loops ×1
partitioning ×1
sql-insert ×1
sqlexception ×1
sum ×1
triggers ×1