【问题标题】:DECODE In Oracle PL/SQL在 Oracle PL/SQL 中解码
【发布时间】:2021-07-08 15:41:35
【问题描述】:

我正在尝试在 PL/SQL 语句中使用 DECODE(用于示例 HR 模式) 但我收到了这个错误:

''exact fetch指定的数小于返回的行数''

这条语句从用户那里得到了一个 DEPARTMENT_ID,将它与一个解码部分进行比较,并显示该部门的位置。

declare
    v_dep varchar2(30);
    v_User_Input number(4):=&EnterLocID;
begin
    select decode(v_User_Input,10,'Seattle',
                                20,'Toronto',
                                30,'Toronto',
                                40,'London',
                                50,'South San Francisco',
                                60,'Southlake',
                                70,'Munich',
                                80,'Oxford',
                                90,'Toronto',
                                'else' )into v_dep from locations l,departments d
    where v_User_Input = d.department_id;
    DBMS_OUTPUT.PUT_LINE(v_dep);
end;
/

【问题讨论】:

  • 这个查询在普通 SQL 中的行为与在 PL/SQL 块中的行为相同,所以我不确定 PL/SQL 与这个问题有什么关系。

标签: oracle plsql


【解决方案1】:

在我看来,您忘记加入 LOCATIONSDEPARTMENTS 表以便它们交叉加入,然后您对 D.DEPARTMENT_ID 应用了过滤器。但是,查询仍有可能返回 2 行或更多行,这些行无法放入标量 V_DEP 变量中。

因此,这就是你可能需要做的(我没有你的表,所以我无法测试它,但我希望你能明白):

FROM locations l join departments d on d.location_id = l.location_id
WHERE l.location_id = v_User_Input

另外,如您所见,我修改了 WHERE 子句并使用 l.location_id 而不是您的 d.department_id。为什么?

  • 因为替换变量建议如此 (&EnterLocID) - 位置 ID,而不是部门 ID
  • 如果真的是d.department_id,那你为什么要加入locationsdepartments呢?如果不需要,请省略 locations 表。

最后,为什么要decode?如果您加入了这两个表,那么您就拥有了所需的一切,即应该这样做:

select l.location_name
into v_dep
from locations l join departments d on d.location_id = l.location_id
where l.location_id = v_user_input

或者,如果出于某种原因(教育?)必须对其进行解码,那么

SELECT DECODE (v_User_Input,
               10, 'Seattle',
               20, 'Toronto',
               30, 'Toronto',
               40, 'London',
               50, 'South San Francisco',
               60, 'Southlake',
               70, 'Munich',
               80, 'Oxford',
               90, 'Toronto',
               'else')
  INTO v_dep
  FROM ldepartments d
 WHERE d.department_id = v_user_input

【讨论】:

  • 非常感谢这是出于教育原因和完全正确的答案?
  • @BarbarosÖzhan 实际上我没有权限,现在我做到了
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2021-09-11
相关资源
最近更新 更多