问题描述
我正在尝试创建一个复杂的函数,我只喜欢我需要它做的第 3 步。这个东西对我来说有点提前。所以,我尝试了跟随 sql,我得到了 2 条记录——这正是我所期望的。但是,当我在函数(和输入变量)中尝试相同的 sql 时,我只得到 1 条记录。如果我删除第一个 select 和 union 语句,我会得到另一条记录。 我传递给我们的唯一参数 userUuid。
在 docker 容器上运行 - postgres:11.5-alpine
普通 sql:(按预期取回 2 条记录)
SELECT
assets.name AS assetName,assets.uuid AS assetUuid,assets.workflow_uuid,projects.name,projects.uuid,projects.project_category_uuid,'Project Role' AS classtype
FROM
projects
JOIN assets ON assets.project_uuid = projects.uuid
WHERE projects.project_category_uuid IN (
SELECT projectCategoryUuid FROM "UserProjectCategoryRoles"
WHERE "UserProjectCategoryRoles".user_uuid = '65a749ee-5417-4187-a1b1-bcfa9a401267'
)
UNION ALL
SELECT
assets.name AS assetName,'Workflow Role' AS classtype
FROM
assets
JOIN projects ON projects.uuid = assets.project_uuid
WHERE assets.workflow_uuid IN (
SELECT workflowUuid FROM "UserWorkflowRoles"
WHERE "UserWorkflowRoles".user_uuid = '65a749ee-5417-4187-a1b1-bcfa9a401267'
);
不工作功能(只能返回或记录)
CREATE OR REPLACE PROCEDURE "public"."revisionsForReview"(
IN userUuid VARCHAR,INOUT name VARCHAR,INOUT uuid VARCHAR,INOUT project_category_uuid VARCHAR,INOUT assetName VARCHAR,INOUT assetUuid VARCHAR,INOUT workflow_uuid VARCHAR,INOUT classtype VARCHAR
)
AS $BODY$BEGIN
SELECT
projects.name,assets.name AS assetName,'Project Role' AS classtype
FROM
projects
JOIN assets ON assets.project_uuid = projects.uuid
WHERE projects.project_category_uuid IN (
SELECT projectCategoryUuid FROM "UserProjectCategoryRoles"
WHERE "UserProjectCategoryRoles".user_uuid = userUuid
)
UNION ALL
SELECT
projects.name,'Workflow Role' AS classtype
FROM
assets
JOIN projects ON projects.uuid = assets.project_uuid
WHERE assets.workflow_uuid IN (
SELECT workflowUuid FROM "UserWorkflowRoles"
WHERE "UserWorkflowRoles".user_uuid = userUuid
)
INTO name,uuid,project_category_uuid,assetName,assetUuid,workflow_uuid,classtype;
END$BODY$
LANGUAGE plpgsql
感谢帮助,再次,这是我功能的开始。在返回数据之前,我需要弄清楚如何循环遍历数据并对数据执行其他操作。到目前为止,我只想了解一些事情。我通常可以在 PHP Laravel 中做所有事情并使用它的迁移。但是这些连接和处理将需要在应用程序中进行更长的处理,并运行多个数据库调用。 联合也在查询视图,我以后可能会删除这些视图,并将所有内容保留在函数中。
提前致谢!
解决方法
感谢“粘滞位”指出使用函数而不是存储过程。让它工作(在调整了一些类型转换之后 - 我发现这真的很奇怪,因为它与文本不同,认为从应用程序消费的角度来看它们是相同的,但我想不完全相同)。
我只会发布最终有效的内容 - 以防其他人遇到类似问题
CREATE OR REPLACE FUNCTION revisions_for_review (
input_user_uuid VARCHAR
)
RETURNS TABLE (
asset_name TEXT,asset_uuid VARCHAR,name VARCHAR,uuid VARCHAR,project_category_uuid VARCHAR,workflow_uuid VARCHAR,class_type TEXT
)
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
RETURN QUERY SELECT
assets.name::TEXT AS asset_name,assets.uuid AS asset_uuid,assets.workflow_uuid,projects.name,projects.uuid,projects.project_category_uuid,'Project Role' AS class_type
FROM
projects
JOIN assets ON assets.project_uuid = projects.uuid
WHERE projects.project_category_uuid IN (
SELECT projectCategoryUuid FROM "UserProjectCategoryRoles"
WHERE "UserProjectCategoryRoles".user_uuid = input_user_uuid
)
UNION ALL
SELECT
assets.name::TEXT AS asset_name,'Workflow Role' AS class_type
FROM
assets
JOIN projects ON projects.uuid = assets.project_uuid
WHERE assets.workflow_uuid IN (
SELECT workflowUuid FROM "UserWorkflowRoles"
WHERE "UserWorkflowRoles".user_uuid = input_user_uuid
);
END;$$