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

如何在SQL脚本中传递token并一次性调用三个plpgsql函数

问题原因

你编写的SQL存在两处语法错误:

  1. 多个CTE(公共表表达式)需要在同一个WITH关键字后用逗号分隔定义,不能重复声明WITH
  2. 子查询作为函数入参传入时,需要额外包裹一层括号

正确实现代码

你可以按如下方式改写,三个函数会在同一事务中依次执行,任意一步报错都会整体回滚:

WITH account_activation_certificate AS (
    -- 调用注册函数,拿到返回的激活token
    SELECT register('john@example.com', 'john', 'abcd1234') AS activation_token
),
activate_step AS (
    -- 传入激活token调用激活函数,返回void不影响后续逻辑
    SELECT activate((SELECT activation_token FROM account_activation_certificate))
),
jwt AS (
    -- 调用登录函数拿到jwt
    SELECT login('john', 'abcd1234') AS jwt_token
)
-- 这里写你后续需要基于jwt执行的查询逻辑,示例为直接返回jwt
SELECT jwt_token FROM jwt;

如果不需要保留中间结果,也可以用更精简的嵌套写法:

WITH jwt AS (
    SELECT login('john', 'abcd1234') AS jwt_token
)
SELECT jwt_token FROM jwt
WHERE EXISTS (
    SELECT activate(register('john@example.com', 'john', 'abcd1234'))
);

注意事项

如果你的register函数存在注册失败返回空值、或者抛出异常的逻辑,建议在注册步骤后添加条件判断,避免后续无效调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:07