我需要用以下函式中的引數替換模式和表名(目前運行良好):
CREATE OR REPLACE FUNCTION public.my_function_119()
RETURNS integer
LANGUAGE plpgsql
AS $function$
DECLARE _check INTEGER;
BEGIN
SELECT SUM("length"/1000)
FROM public."National_Grid_multiline"
INTO _check;
RETURN _check;
END
$function$
我嘗試了以下解決方案(及其眾多變體):
CREATE OR REPLACE FUNCTION public.my_function_119(schema text, tablename text)
RETURNS INTEGER
LANGUAGE plpgsql
AS
$function$
DECLARE _check INTEGER;
BEGIN
RETURN
'(SELECT SUM((length/1000))::integer FROM ' || schema || '."' || tablename || '")::integer INTO _check' ;
RETURN _check;
END
$function$
但不斷遇到以下錯誤代碼:
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "(SELECT SUM((length/1000))::integer FROM public."National_Grid_multiline")::integer INTO _check"
CONTEXT: PL/pgSQL function my_function_119(text,text) while casting return value to function's return type
為什么這不起作用?'length' 列包含浮點值。
uj5u.com熱心網友回復:
您必須使用動態 SQL,因為您不能將引數用于識別符號。
另外,請確保通過使用format而不是連接字串來避免 SQL 注入:
EXECUTE
format(
'(SELECT SUM((length/1000))::integer FROM %I.%I',
schema,
table_name
)
INTO _check';
uj5u.com熱心網友回復:
你可以試試這個:
CREATE OR REPLACE FUNCTION public.my_function_119(schema text, tablename text)
RETURNS INTEGER
LANGUAGE plpgsql
AS
$function$
DECLARE
res integer ;
BEGIN
EXECUTE E'
(SELECT SUM((length/1000))::integer INTO res FROM ' || schema || '."' || tablename || '"):: integer' ;
RETURN res ;
END ;
$function$
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/337125.html
標籤:PostgreSQL 功能 动态的
