如何编译这段PLSQL?

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 ||

任何人都可以帮我这个吗?

Ben*_*Ben 5

正如其他答案中所述,您的函数无法编译的原因有三个.

  1. 您已声明该变量v_names并将其引用为v_name.
  2. PL/SQL中的赋值运算符是:=,您正在使用相等运算符=.
  3. 你的回复陈述中缺少一个分号; 它应该是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)

请注意我做的一些其他更改:

  1. 在函数参数前面添加一个不同于变量的字母,以使其清楚哪个是哪个.
  2. 添加一些异常处理来处理该特定管理器没有数据.
  3. ,如果没有数据我会返回NULL,你会返回NULL.如果要返回逗号而只是将其放在异常中.
  4. 而不是费心创建游标并循环通过它等我让Oracle做了繁重的工作.

很奇怪你想要返回一个以逗号分隔的列表,因为在Oracle之后你几乎无法用它做什么.返回类似数组的内容或包含所有姓氏的开放游标可能更为正常.在这个答案中,我认为你有充分的理由去做你自己.