DECODE In Oracle PL/SQL



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

"精确提取中指定的数字小于返回的行">

此语句从用户处获取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;
/

在我看来,您忘记了连接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。为什么?

  • 因为替换变量表示so(&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

最新更新