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;
我想使用以下代码调用名称在变量中的存储过程:
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;