【问题标题】:PostgreSQL Call a stored procedure with its name is into variablePostgreSQL 调用存储过程,其名称为变量
【发布时间】:2021-12-27 10:46:49
【问题描述】:

我想用这个代码调用一个名称在变量中的存储过程:

    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 函数在变量中调用具有名称的存储过程?

【问题讨论】:

    标签: postgresql procedure execute


    【解决方案1】:

    最后在下面的代码中用INTO子句成功获取了输出变量:

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

    【讨论】:

      【解决方案2】:

      问题在于动态 SQL 没有“看到”变量,因为它不在同一个块上下文中运行 (documentation)。尝试这样做:

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

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

      【讨论】:

      • 它有效,你是对的。输出变量为空。感谢您的帮助。
      猜你喜欢
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多