微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有联合的 PostgreSQL 函数不返回所有记录

如何解决带有联合的 PostgreSQL 函数不返回所有记录

我正在尝试创建一个复杂的函数,我只喜欢我需要它做的第 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;$$

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。