在Qyery无法解决ora-06550 pls-00103错误

时间:2017-05-11 08:57:54

标签: oracle plsql

我从SCHEDULEEMPLOYEES写了以下查询来更新表EMPSHIFT VALUES 表但是得到以下错误ora-06550 pls-00103并无法解决它 那是什么问题

DECLARE
  day_date DATE:=TO_DATE('01/04/2017','DD/MM/YYYY');
BEGIN
   LOOP
         FOR employees IN (SELECT EmpID FROM EMPSHIFT)
             LOOP
                 EXECUTE IMMEDIATE
                         ' UPDATE EMPSHIFT SET EMPSHIFT."'||TO_CHAR(day_date)||'" = 
                          (
                                SELECT  SCHEDULEEMPLOYEES.SCHEDULEID ||'-'|| SCHEDULEEMPLOYEES.SHIFTS  
                                FROM SCHEDULEEMPLOYEES INNER JOIN EMPSHIFT  ON  SCHEDULEEMPLOYEES.EMPLOYEEID = EMPSHIFT.EMPLOYEEID  
                                WHERE SCHEDULEEMPLOYEES.DAYDATE = '||TO_CHAR(day_date)||' and EMPSHIFT.EMPLOYEEID = ' || employees.EmpID ||'
                          ) 
                         WHERE  EMPSHIFT.EMPLOYEEID =' ||employees.EmpID ||';';
                          day_date = day_date + 1;
                 EXIT
                 WHEN day_date >TO_DATE('30/04/2017','DD/MM/YYYY');
                 END LOOP;
   END LOOP;
END;  

1 个答案:

答案 0 :(得分:0)

1)正如其他人所提到的," day_date = day_date + 1;"缺少正确的赋值运算符":="。 2)"执行......"这里不需要部分。你为什么用它? 3)你的目标是什么?目前的结构看起来很奇怪"。第一个循环语句无法控制流,只有内部流控制,但其循环迭代仅基于员工数,而不是日期。 4)更新声明是否正确?我的意思是"设置empshift。< ..>。我怀疑,他有一个名为" 01/04/2017"的属性。 创建了一个示例:

declare
  l_day_date date:=to_date('01/04/2017','DD/MM/YYYY');
  l_res varchar2(400);
begin
loop
for l_emp in (select emp_id from empshift_test_v)
loop    
  dbms_output.put_line('the emp_id is :'||l_emp.emp_id);
  --update empshift_test_v etv
  --set etv.empshift_code/*<correct_att_name>*/ = (
  select
    nvl((select  
      sct.sch_id ||'-'|| sct.shifts shift_code
    from 
      SCHEDULEEMPLOYEES_TEST_V sct,
      empshift_test_v etv1 
    where 
      sct.day_date = l_day_date and 
      sct.emp_id = etv1.emp_id and
      etv1.emp_id = l_emp.emp_id),'no_info')
  into
    l_res
  from
    empshift_test_v etv
  where  
    etv.emp_id = l_emp.emp_id;      
  dbms_output.put_line('day_date is :'||to_char(l_day_date,'DD/MM/YYYY'));
  dbms_output.put_line('l_res is :'||l_res);     
end loop;
l_day_date := l_day_date + 1;                        
exit when l_day_date >to_date('30/04/2017','DD/MM/YYYY');
end loop;
end;

WHERE views&#34; EMPSHIFT_TEST_V&#34;和&#34; SCHEDULEEMPLOYEES_TEST_V&#34;有这样的信息: enter image description here

希望它有所帮助。

更新: 根据你的数据修改它。

declare
l_day_date date:=to_date('01/04/2017','DD/MM/YYYY');
l_res number;
l_stmt varchar2(4000);
begin
loop
for l_emp in (select emp_id from empshift_test)
loop    
  dbms_output.put_line('the emp_id is :'||l_emp.emp_id);
  begin
    select  
      sct.shift
    into
      l_res
    from 
      SCHEDULEEMPLOYEES_TEST sct,
      empshift_test etv 
    where 
      sct.daydate = l_day_date and 
      sct.emp_id = etv.emp_id and
      etv.emp_id = l_emp.emp_id;   
  exception
    when NO_DATA_FOUND then
      l_res := 0;
  end;    
  dbms_output.put_line('day_date is :'||to_char(l_day_date,'DD/MM/YYYY'));
  dbms_output.put_line('l_res is :'||l_res);  

  if l_res > 0 then

    l_stmt := 'update empshift_test emp
      set emp."'||to_char(l_day_date,'DD/MM/YYYY')||'" = '||l_res||'
      where  emp.emp_id = '||l_emp.emp_id||';';

    dbms_output.put_line('l_stmt is :'||l_stmt); 
    execute immediate l_stmt;     

  end if;   
  end loop;
  l_day_date := l_day_date + 1;                        
  exit when l_day_date >to_date('30/04/2017','DD/MM/YYYY');
end loop;
end;  

但是有一个问题:如果你手动运行DML语句 - 它可以工作,但是执行立即 - 它会抛出错误ora-00933。由于某种原因,他无法阅读数字专栏。 另一个很好的堆栈问题要解决:) 所以计划是: 1)改变表格结构;要么 2)在使用execute immediate命名为数字(使用&#34; /&#34;等符号)调用属性时,解决问题。