PostgreSQL 存储过程通过连接表中的输入 ID 获取员工

问题描述 投票:0回答:1

我正在尝试编写一个存储过程来通过输入 ID 获取员工。在 SQL Server 中,它看起来像这样:

CREATE PROCEDURE [dbo].[GetbyID]
    (@ID NVARCHAR(50))
AS
BEGIN
    SELECT * 
    FROM dbo.Employee AS M
    LEFT OUTER JOIN dbo.Position AS F1 ON M.PositionID = F1.PositionID
    LEFT OUTER JOIN dbo.Department AS F2 ON F1.DepartmentID = F2.DepartmentID
    WHERE M.ID = @ID
END

我在 PostgreSQL 中重新编写它,如下所示:

DROP PROCEDURE IF EXISTS GetbyID(p_ID TEXT);

CREATE OR REPLACE PROCEDURE GetbyID(p_ID TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
    SELECT * FROM "Employee" AS M
    LEFT OUTER JOIN "Position" AS F1 ON M."PositionID" = F1."PositionID_P"
    LEFT OUTER JOIN "Department" AS F2 ON F1."DepartmentID_P" = F2."DepartmentID"
    WHERE M."ID" = p_ID;
END;
$$;

它说“查询返回成功”,但是,当我尝试通过 CALL 进行测试时,例如:

CALL GetbyID('E12345');

我收到此错误:

错误:查询没有结果数据的目的地
提示:如果您想放弃 SELECT 的结果,请使用 PERFORM。
上下文:PL/pgSQL 函数 getbyid(text) 第 3 行 SQL 语句
SQL 状态:42601

如何解决这个问题?谢谢你。

sql postgresql stored-procedures plpgsql pgadmin-4
1个回答
0
投票

我会使用函数而不是存储过程,函数可以返回结果集,这似乎是您试图通过

SELECT
语句实现的目标。

DROP FUNCTION IF EXISTS GetbyID(TEXT);

CREATE OR REPLACE FUNCTION GetbyID(p_ID TEXT)
RETURNS SETOF RECORD
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY SELECT M.*, F1.*, F2.* FROM "Employee" AS M
    LEFT OUTER JOIN "Position" AS F1 ON M."PositionID" = F1."PositionID_P"
    LEFT OUTER JOIN "Department" AS F2 ON F1."DepartmentID_P" = F2."DepartmentID"
    WHERE M."ID" = p_ID;
END;
$$;

要调用此函数并检索其结果,您可以使用以下命令:

SELECT * FROM GetbyID('E12345') AS t( /* column list */ );

使用

AS t(/* column list */);,
时,您需要通过列出与函数输出匹配的列及其数据类型来指定返回表的结构。例如,如果您的函数返回两列,
employee_name TEXT and department_name TEXT
,您可以编写:

SELECT * FROM GetbyID('E12345') AS t(employee_name TEXT, department_name TEXT);
© www.soinside.com 2019 - 2024. All rights reserved.