如何在SQL脚本中传递token并一次性调用三个plpgsql函数
问题原因
你编写的SQL存在两处语法错误:
- 多个CTE(公共表表达式)需要在同一个
WITH关键字后用逗号分隔定义,不能重复声明WITH - 子查询作为函数入参传入时,需要额外包裹一层括号
正确实现代码
你可以按如下方式改写,三个函数会在同一事务中依次执行,任意一步报错都会整体回滚:
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
相关产品推荐
相关产品推荐

