You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至PostgreSQL:Oracle PL/SQL中:new的等效替代语法是什么?

Oracle PL/SQL的:new在PostgreSQL中的等效用法

嘿,我来帮你理清这个迁移问题!Oracle里的:new主要有两个常见场景——触发器中引用新行数据,以及插入后获取刚插入的记录,PostgreSQL在这两个场景下都有对应的实现,下面分别说明:

1. 触发器中引用新插入/更新的行数据

在Oracle的触发器里,:new用来指代触发事件中将要插入或更新的新行记录,PostgreSQL的触发器函数里直接用大写的NEW变量即可,用法几乎一致,只是不需要前面的冒号。

举个例子:

Oracle PL/SQL触发器示例

CREATE OR REPLACE TRIGGER trg_after_insert_users
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('新插入用户ID: ' || :new.user_id);
END;
/

PostgreSQL等效触发器实现

首先创建触发器函数:

CREATE OR REPLACE FUNCTION trg_after_insert_users_func()
RETURNS TRIGGER AS $$
BEGIN
  RAISE NOTICE '新插入用户ID: %', NEW.user_id; -- 用NEW替代:new
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

然后绑定触发器到表:

CREATE TRIGGER trg_after_insert_users
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION trg_after_insert_users_func();

2. 插入后直接获取刚插入的完整行

如果是在PL/SQL块中插入数据后,想用:new风格的方式拿到刚插入的记录,PostgreSQL可以用INSERT ... RETURNING子句配合变量接收,或者直接返回结果。

场景1:PL/pgSQL块中获取插入行

DECLARE
  v_new_user users%ROWTYPE;
BEGIN
  INSERT INTO users (username, email)
  VALUES ('john_doe', 'john@example.com')
  RETURNING * INTO v_new_user; -- 将整行数据存入变量

  -- 之后可直接使用变量的字段,比如v_new_user.user_id
  RAISE NOTICE '刚插入的用户ID是: %', v_new_user.user_id;
END;
$$ LANGUAGE plpgsql;

场景2:直接在SQL中获取插入结果

如果是在交互式SQL会话或者应用程序中执行插入,直接用RETURNING就能返回刚插入的行,不需要额外变量:

INSERT INTO users (username, email)
VALUES ('jane_smith', 'jane@example.com')
RETURNING *; -- 会返回刚插入的完整行数据

关键区别总结

  • 触发器中:Oracle的:new.column → PostgreSQL的NEW.column(大写,无冒号)
  • 插入后获取行:Oracle可能用INSERT ... RETURNING ... INTO结合:new相关变量,PostgreSQL直接用INSERT ... RETURNING ... INTO绑定变量,或者直接返回结果

内容的提问来源于stack exchange,提问作者ekxz900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:15:12