【问题标题】:How to execute a SQL string returned from a stored procedure in Postgresql?如何执行从 Postgresql 中的存储过程返回的 SQL 字符串?
【发布时间】:2021-11-19 16:59:28
【问题描述】:

下面有一个简单的存储过程,它返回一个 SQL 字符串:

CREATE OR REPLACE PROCEDURE dbo.select_users_test(sqlstring inout text)
LANGUAGE plpgsql
AS
$$
BEGIN
        sqlstring = 'select * from dbo.user where usr_key in (1, 2);';
END;
$$;

我可以这样调用存储过程:

CALL dbo.select_users_test('')

结果是:

sqlstring text
select * from dbo.user where usr_key in (1, 2);

我想要实现的是执行从存储过程返回的 SQL 字符串。

我试过了

EXECUTE QUERY CALL dbo.select_users_test('');

EXECUTE CALL dbo.select_users_test('');

但两者都抛出错误:

“CALL”处或附近的语法错误

我明确地尝试使用存储过程而不是函数来实现这一点,是否可以执行返回的 SQL 字符串?

【问题讨论】:

  • 如果你想返回一个函数,而不是一个过程
  • 你看不到,Return from procedure。您可以 Execute 查询只是不返回它,除非您将其分解为 OUT 变量,我很确定这不是您想要的。您将需要使用一个函数。
  • 除了使用函数 - 使用 plpgsql - DO $$ ..... $$;
  • @MichałZaborowski,DO 也不能RETURN
  • 正如我已经提到的,我试图通过存储过程而不是函数来实现这一点,我有大约 400 个从 SQLSever 迁移过来的存储过程。将所有这些 SP 更新为函数将是一项非常繁琐的任务。

标签: postgresql stored-procedures plpgsql dynamic-sql


【解决方案1】:

是的,你可以从过程中返回一个值,你不应该,但你可以。但是,您不能按照您的建议称呼它。您正在尝试使用文字值(长度为 0 的字符串)调用该过程并在其中接收一个值。但是文字参数是一个常量,因此您无法更改该值。您拒绝转换为函数,因为转换为函数将是一项非常乏味的任务。然而,使用过程将是一项至少如果不是更乏味的任务。您必须声明一个变量来接收结果,然后传递该变量。因此,在您想使用该程序的任何地方,您都需要以下内容:

do $$
declare
   v_to_receive_sql text = '';

begin 
   raise notice 'v_to_receive_sql =>%',v_to_receive_sql;
   call select_users_test(v_to_receive_sql);
   raise notice 'v_to_receive_sql =>%',v_to_receive_sql;
end;
$$;

正如@a_horse_with_no_name 所述,首先您需要阅读并注意Migrate your mind set too。 Postgres 和 MS Sql Server 非常不同。除非您进行这种心态调整,否则您将处于非常困难的时期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2021-08-15
    • 1970-01-01
    • 2021-12-30
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多