【问题标题】:PL SQL more than single row returned issuePL SQL 多于单行返回问题
【发布时间】:2015-12-30 10:32:46
【问题描述】:

我正在执行以下查询,我得到 “ORA-01427:单行子查询返回多于一行”。 错误在位于主 SELECT 中的 DECODE 中返回。 我不能将 USER_PRF_NOTIFICATION_T 表放在 FROM 部分,因为 USER_PRF_NOTIFICATION_T 可能不包含任何值。如果确实如此,则 SEC_USER_PRIV.ENTITY_ID 中的值不会全部存在于 USER_PRF_NOTIFICATION_T.ENTITY_ID 中。

    SELECT DISTINCT
    SEC_USER.USR_ID         AS USR_ID,
    SEC_USER.USR_FIRST_NAME AS USR_FIRST_NAME,
    SEC_USER.USR_LAST_NAME  AS USR_LAST_NAME,
    SEC_USER_PRIV.ROLE_ID   AS SYSTEM_ROLE_ID,
    DECODE (
              (
              SELECT
                  SYSTMTYP_CODE
              FROM
                  USER_PRF_NOTIFICATION_T
              WHERE
                  USER_PRF_NOTIFICATION_T.USR_ID = SEC_USER.USR_ID
              AND USER_PRF_NOTIFICATION_T.ENTITY_ID IN
                  (
                      SELECT
                          SERVER_T.SRV_ID
                      FROM
                          SERVER_T
                      WHERE
                          UPPER(SERVER_T.SRV_NAME) LIKE UPPER('%gen%') )
              AND USER_PRF_NOTIFICATION_T.ENTITY_TYP_CODE = 21), 1, 'SYSTEM', 2, 'TEST', NULL ,
            'ALL') AS ENTITY_SYSTM_TYP_NOTIFICATION
FROM
    SEC_USER_PRIV,
    SEC_USER
WHERE
    SEC_USER.USR_ID = SEC_USER_PRIV.USR_ID
AND ((
            SEC_USER_PRIV.ENTITY_TYP_CODE = 21
        AND SEC_USER_PRIV.ENTITY_ID IN (
            (
                SELECT
                    SERVER_T.SRV_ID
                FROM
                    SERVER_T
                WHERE
                    UPPER(SERVER_T.SRV_NAME) LIKE UPPER('%gen%') ))))

如何解决这个问题?直接引用实体 ID 显然可以解决该问题。 我尝试使用包含所有 ID 的 tableof 并尝试:

USER_PRF_NOTIFICATION_T.ENTITY_ID IN (tableof) 但我得到了同样的错误。 如何解决这个问题? 我需要在 FROM 部分中选择的 ID 和 DECODE 中使用的 ID 之间建立关联。

提前致谢。

【问题讨论】:

  • 查询中的括号看起来不平衡。如果您确认上述查询是生成您声称的错误输出的原因,我将为您解决此问题。
  • 能否请您修复任何语法错误并正确格式化代码?很难阅读。
  • @Drumbeg,完成。对此感到抱歉。
  • 当解码来自 USER_PRF_NOTIFICATION_T 的子查询返回多行时,您希望 Oracle 究竟做什么?这就是为什么你得到你的错误。使子查询始终返回一行(例如通过 distinct、group by 或其他约束),您就完成了。

标签: oracle plsql ora-01427


【解决方案1】:

我认为您在键/值对列表中添加了“NULL”,这是导致错误的原因。

`1, 'SYSTEM', 2, 'TEST', NULL , 'ALL'`

这里去掉NULL

【讨论】:

  • 但是 'NULL' 是一个可能的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2018-12-25
  • 2013-11-20
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多