我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。
下面是我的功能:
CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state text, district text, organizationId text, bloodGroup text, status text, approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
concat_ws(' AND '
, CASE WHEN state IS NOT NULL THEN 'state = $2' END
, CASE WHEN district IS NOT NULL THEN 'district = $3' END
, CASE WHEN bloodGroup IS NOT NULL THEN …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。
create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN
// foreach(key in input)
// do some math operation on its corresponding value
returns input;
END; $$
Run Code Online (Sandbox Code Playgroud)
参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.
我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。
我正在尝试检查什么事件称为我的触发器,例如INSERT,UPDATE或DELETE。
Oracle 触发器可以在一个简单的“IF”语句中进行检查:
IF INSERTING, IF UPDATING or even IF DELETING
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 上有类似的说法吗?
通常我只是创建一个函数 for INSERT,另一个 forUPDATE和一个 for DELETE,但如果有某种方法只创建一个函数,那就浪费了代码。
有人可以帮忙吗?
我有一个安装程序,需要 plpgsql 在 PostgreSQL 8.4 数据库中安装存储过程。我需要确保安装了语言,否则应用程序将失败。我不想放弃语言并重新添加它,因为这可能会搞砸其他一些事情。
有没有办法“轻轻”安装语言?
CREATE LANGUAGE IF NOT EXISTS似乎无效。
postgresql plpgsql functions postgresql-8.4 postgresql-extensions
我的函数中几乎没有 FOREACH 循环。这些循环似乎与官方 postgresql 文档完全一致。返回此错误消息:
ERROR: loop variable of FOREACH must be a known variable or list of variables
SQL state: 42601
Run Code Online (Sandbox Code Playgroud)
谷歌没有找到任何关于postgresql "loop variable of FOREACH". 我以某种方式为我的旧 foreach 循环解决了这个问题,但我不记得如何解决,并且我找不到任何对于解决此错误可能重要的差异。
我在 Windows XP 32 位上有 PostgreSQL 9.3.4 和 pgAdmin III 1.18.1。以下是函数中有趣的部分:
CREATE OR REPLACE FUNCTION vloz_kont() RETURNS trigger AS $$
DECLARE
_idmat integer;
_nazmat text;
_zast text;
sj_nad text;
...
BEGIN
...
--bugged loop
FOREACH _mat IN ARRAY NEW._material::text[] LOOP
SELECT split_part( _mat, ' ', 1 …Run Code Online (Sandbox Code Playgroud) PostgreSQL newbie here trying to put together a transactional DDL script to atomically create a database and its schema in Postgres 9.3: in a transaction, create a few tables; if any errors, roll the whole thing back; otherwise commit. I'm having a hard time getting the syntax right, and I suspect my problems might stem from conflating SQL DDL with PL/pgSQL and/or not grokking the transaction semantics.
Long story short, what's the PL/pgSQL boilerplate for a script to do something …
我面临一个绝对奇怪的问题,感觉更像是 Postgres 错误而不是算法问题。
我有这个功能:
CREATE FUNCTION sp_connect(mail character varying, passwd character varying, role character varying)
RETURNS json LANGUAGE plpgsql STABLE AS
$$
DECLARE
user_info record;
BEGIN
IF role = 'Role1' THEN
SELECT u.id, r.name INTO user_info
FROM users u
INNER JOIN users_roles ur ON ur.user_id = u.id
INNER JOIN roles r ON ur.role_id = r.id
WHERE u.email = mail
AND u.password = encode(digest(CONCAT(passwd, u.password_salt), 'sha512'), 'hex')
AND r.name = 'Role1';
ELSIF role = 'Role2' THEN
SELECT h.id, 'Role1' AS name …Run Code Online (Sandbox Code Playgroud) 考虑函数内的以下(不完整的)PL/pgSQL 块:
CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
RETURNS NUMERIC
RETURNS NULL ON NULL INPUT
IMMUTABLE
LANGUAGE plpgsql
AS $$
BEGIN
RETURN some_third_party_function(myvar1, myvar2);
EXCEPTION WHEN internal_error THEN
IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
RETURN 0;
ELSE
-- Reraise the original exception here
RAISE EXCEPTION '%', SQLERRM;
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。
如何重新引发或重新抛出未修改的原始异常?
我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。
我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:
https://www.postgresql.org/docs/11/errcodes-appendix.html
我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。
是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?
当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at = now();
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END;
$$ language 'plpgsql';
CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)
当我插入包含 json 和 jsonb 列的表时,出现以下错误:
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at …Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×10
functions ×2
json ×2
trigger ×2
ddl ×1
dynamic-sql ×1
exception ×1
parameter ×1
plan-cache ×1
transaction ×1