如何在postgres中使用另一个函数来显示函数的输出?


CREATE TABLE employee
(
joining_date date,
employee_type character varying,
name character varying 
);
insert into employee VALUES
(NULL,'as','hjasghg'),
('2022-08-12', 'Rs', 'sa'),
(NULL,'as1','hjasghg1'),
('2024-09-12', 'Rs1', 'sa1'),
(NULL,'as2','hjasghg2'),
('2023-12-12', 'Rs2', 'sa2'),
(NULL,'asktyuk12','hjasg21');

这是一个虚拟表,我有两个函数,如果我使用fn_search(name),一个给出employee_type和名称,另一个给出名称列表和joining_date,可以通过loginid fn_login(loginid)访问。我想使用fn_login(loginid)并创建一个fn_search(name, loginid)。我已经在fn_search(name, loginid)中声明并分配了一个变量listname := fn_login(loginid),我想知道的是我应该将listname声明为文本或记录,因为它返回一行或有时不止一行。此外,我应该如何进一步使用它来生成数据,只有当用户的登录可以访问这个记录。

setup:

CREATE TABLE employee (
loginid bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
joining_date date,
employee_type text,
name text
);
INSERT INTO employee (joining_date, employee_type, name)
VALUES (NULL, 'as', 'hjasghg'), ('2022-08-12', 'Rs', 'sa'),
(NULL, 'as1', 'hjasghg1'),      ('2024-09-12', 'Rs1', 'sa1'),
(NULL, 'as2', 'hjasghg2'),      ('2023-12-12', 'Rs2', 'sa2'),
(NULL, 'asktyuk12', 'hjasg21');

fn_login函数,它可以返回多于1行

CREATE OR REPLACE FUNCTION fn_login (IN _loginid bigint)
RETURNS TABLE (
_name text,
_joining_date date
)
AS $$
BEGIN
RETURN query
SELECT
name,
joining_date
FROM
employee
WHERE
loginid >= _loginid;
END;
$$
LANGUAGE plpgsql;

我想知道的是我应该将listname声明为文本还是在返回一行或有时不止一行时记录

listname := fn_login(loginid),如果你想用listname做更多的计算,那么你需要通过listname循环。
跟随/模仿手动示例:https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING提供以下功能。

CREATE OR REPLACE FUNCTION fn_search (IN _name text, IN _loginid bigint)
RETURNS void
AS $$
DECLARE
rec record;
i int := 1;
BEGIN
FOR rec IN (
SELECT
*
FROM
fn_login (_loginid))
LOOP
RAISE NOTICE '[%] rec._name: %, rec._joining_date: %', i, rec._name, rec._joining_date;
IF rec._joining_date IS NULL THEN
RAISE NOTICE 'fn_login join_date is null';
END IF;
i := i + 1;
END LOOP;
END;
$$
LANGUAGE plpgsql;

最新更新