Kat*_*ine 1 oracle plsql function
我需要为经理ID取决于传递参数的所有员工返回字符串格式的员工姓名.当我编译该函数时,我得到一个错误.这是功能代码:
create or replace function Employee(v_manid IN employees.manager_id%type)
return varchar2
AS
cursor cur_emp is select last_name from employees where manager_id = v_manid;
v_names varchar2(10);
begin
for emp_rec in cur_emp
loop
v_name = v_name || emp_rec.last_name ||', ';
end loop;
return v_name
end;
/
Run Code Online (Sandbox Code Playgroud)
错误是:
错误(8,8):PLS-00103:遇到以下其中一项时遇到符号"=":: =.(@%;错误(8,44):PLS-00103:遇到以下其中一项时遇到符号";":),*& - +/at mod remaining rem和or ||
任何人都可以帮我这个吗?
正如其他答案中所述,您的函数无法编译的原因有三个.
v_names并将其引用为v_name.:=,您正在使用相等运算符=.return v_name;它不会停止编译函数,但变量v_names声明为a varchar2(10).当具有多个下属的经理所有姓氏都适合这种情况时,这种情况极不可能发生.您应该使用最大大小声明此变量; 以防万一.
我想补充一点,你这样做效率很低.如果你要在SQL中进行字符串聚合而不是PL/SQL循环,那就更好了.从11g第2版你就有了这个listagg()功能; 如果您之前使用的是版本,那么还有很多其他字符串聚合技术可以实现相同的结果.
create or replace function employee ( p_manid in employees.manager_id%type
) return varchar2 is
v_names varchar2(32767); -- Maximum size, just in case
begin
select listagg(lastname, ', ') within group ( order by lastname )
into v_names
from employees
where manager_id = p_manid;
return v_names;
exception when no_data_found then
return null;
end;
/
Run Code Online (Sandbox Code Playgroud)
请注意我做的一些其他更改:
,如果没有数据我会返回NULL,你会返回NULL.如果要返回逗号而只是将其放在异常中.很奇怪你想要返回一个以逗号分隔的列表,因为在Oracle之后你几乎无法用它做什么.返回类似数组的内容或包含所有姓氏的开放游标可能更为正常.在这个答案中,我认为你有充分的理由去做你自己.