PostgreSQL 调用存储过程,其名称为变量

PostgreSQL Call a stored procedure with its name is into variable

我想使用以下代码调用名称在变量中的存储过程:

    DECLARE
      spName text;
      varIn1 text;
      varIn2 text;
      varOut text;
      varSQLQuery text;
    BEGIN
    spName := 'myProc';
    varIn1 := 'Value1';
    varIn2 := 'Value2';
    varSQLQuery := format('CALL myschema.%s(varIn1,varIn2,varOut);',spName,);
    RAISE NOTICE 'varSQLQuery %', varSQLQuery;
    EXECUTE varSQLQuery;
    RAISE NOTICE 'varOut %', varOut;

如果我将 varSQLQuery 中的打印查询复制并粘贴到代码中,它们就会起作用。 但它在EXECUTE函数中不起作用。

错误是:“列“varIn1”不存在”。

我也试过这个:

varSQLQuery := format('CALL myschema.%s(varIn1,varIn2,varOut);',spName);
EXECUTE IMMEDIATE varSQLQuery;

varSQLQuery := format('
  BEGIN
  CALL myschema.%s(varIn1,varIn2,varOut);
  END;'
,spName);
EXECUTE varSQLQuery;

varSQLQuery := format('myschema.%s(varIn1,varIn2,varOut);',spName);
EXECUTE varSQLQuery;

varSQLQuery := format('myschema.%s(varIn1,varIn2,varOut);',spName);
CALL varSQLQuery;

我没有更多的新想法了。

那么,如何使用(或不使用?)EXECUTE 函数在变量中调用带有名称的存储过程?

问题是动态 SQL 不会 'see' 变量,因为它不会 运行 在同一块上下文 (documentation) 中。尝试这样做:

varSQLQuery := format('CALL myschema.%s(,,);', spName);
RAISE NOTICE 'varSQLQuery %', varSQLQuery;
EXECUTE varSQLQuery using varIn1, varIn2, varOut;

但是,该过程的输出参数不会按预期工作。 varOut 的值不会改变。使用函数而不是过程可能是更好的主意。

终于在下面的代码中通过INTO子句成功获取到了输出变量:

varSQLQuery := format('CALL myschema.%s(,,);', spName);
RAISE NOTICE 'varSQLQuery %', varSQLQuery;
EXECUTE varSQLQuery INTO varOut USING varIn1, varIn2, varOut;