[英]How to pass table name to plpgsql function
我正在嘗試運行代碼:
CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tablename text) returns int
AS $$
DECLARE
counter int;
rec record;
tname text;
BEGIN
counter = 0;
tname := tablename;
FOR rec IN
select *
from tname
loop
counter = counter + 1;
end loop;
RETURN counter;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER;
此代碼的目標是返回您輸入的表中的行數。 我知道這可能不是完成此任務的最佳方法,但是此功能的結構可以很好地擴展到我要解決的另一個問題。 每次運行代碼時,都會出現錯誤:
ERROR: syntax error at or near "$1"
我發現的所有在線資源都告訴我如何在EXECUTE
塊內使用輸入變量,但在上述情況下不行。
當前正在運行PostgreSQL 8.2.15。
CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tbl regclass, OUT row_ct int) AS
$func$
BEGIN
EXECUTE 'SELECT count(*) FROM '|| tbl
INTO row_ct;
END
$func$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER;
呼叫:
SELECT anly_work_tbls.testfncjh('anly_work_tbls.text_tbl');
這應該適用於Postgres 8.2,但是無論如何您都考慮升級到當前版本 。
regclass
傳遞,該表名自動進行引用並與架構限定的名稱一起使用。 細節:
使用OUT
參數可簡化功能。
不要引用語言名稱。 這是一個標識符。
如果您實際上需要遍歷動態查詢的結果:
CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tbl regclass)
RETURNS int AS
$func$
DECLARE
counter int := 0; -- init at declaration time
rec record;
BEGIN
FOR rec IN EXECUTE
'SELECT * FROM ' || tbl
LOOP
counter := counter + 1; -- placeholder for some serious action
END LOOP;
RETURN counter;
END
$func$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER;
閱讀手冊中的本章: 遍歷查詢結果
在plpgsql中記錄的賦值運算符是:=
:
是的,實際上並不是最好的方法,但這可以工作:
CREATE OR REPLACE FUNCTION testfncjh (tablename text) returns int
AS $$
DECLARE
counter int;
rec record;
BEGIN
counter = 0;
FOR rec IN
EXECUTE 'select * from '||quote_ident(tablename) loop
counter = counter + 1;
end loop;
RETURN counter;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER;
這樣會更好:
CREATE OR REPLACE FUNCTION testfncjh (tablename text) returns int
AS $$
DECLARE _count INT;
BEGIN
EXECUTE 'SELECT count(*) FROM '|| quote_ident(tablename) INTO _count;
RETURN _count;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.