无法解决 ora-06550 pls-00103 查询中的错误

Posted

技术标签:

【中文标题】无法解决 ora-06550 pls-00103 查询中的错误【英文标题】:Can't Solve ora-06550 pls-00103 ERROR in Qyery 【发布时间】:2017-10-10 04:33:03 【问题描述】:

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

宣布 day_date DATE:=TO_DATE('01/04/2017','DD/MM/YYYY'); 开始 环形 对于员工(从 EMPSHIFT 中选择 EmpID) 环形 立即执行 ' UPDATE EMPSHIFT SET EMPSHIFT."'||TO_CHAR(day_date)||'" = ( 选择SCHEDULEEMPLOYEES.SCHEDULEID ||'-'||排班员工。轮班 FROM SCHEDULEEMPLOYEES INNER JOIN EMPSHIFT ON SCHEDULEEMPLOYEES.EMPLOYEEID = EMPSHIFT.EMPLOYEEID WHERE SCHEDULEEMPLOYEES.DAYDATE = '||TO_CHAR(day_date)||'和 EMPSHIFT.EMPLOYEEID = ' ||雇员.EmpID ||' ) WHERE EMPSHIFT.EMPLOYEEID =' ||employees.EmpID ||';'; day_date = day_date + 1; 出口 WHEN day_date >TO_DATE('30/04/2017','DD/MM/YYYY'); 结束循环; 结束循环; 结尾;

【问题讨论】:

解决此类问题的诀窍是首先显示您要尝试的内容execute immediate。只需打印它,然后尝试调试它。 您的代码中有很多问题。在day_date = day_date + 1; 中,您缺少:;在||'-'|| 你需要双引号;似乎EMPSHIFT 既有EmpId 又有EMPLOYEEID 列,对吗?您构建的查询使用不带引号的日期或(更好)使用to_date,... 喜欢这个 day_date := day_date + 1; 谢谢,列名是 EMPLOYEEID,我加了双引号,但还是不行 您要更新哪一栏? 【参考方案1】:

1) 正如其他人所说,“day_date = day_date + 1;”缺少正确的赋值运算符“:=”。 2)这里不需要“执行...”部分。你为什么使用它? 3)你的目标是什么?目前的结构看起来很“奇怪”。第一个循环语句无法控制流程,只有内部的有,但它的循环迭代仅基于员工人数,而不是日期。 4) 更新语句是否正确?我的意思是“set 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 视图“EMPSHIFT_TEST_V”和“SCHEDULEEMPLOYEES_TEST_V”包含如下信息: 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) 解决问题,当调用一个以数字命名的属性时,使用立即执行。

【讨论】:

感谢程序成功运行,但没有像***.com/questions/43889344/…那样解决我的需求 根据你的数据修改: 非常感谢,但得到错误 ORA-06550 end of file error

以上是关于无法解决 ora-06550 pls-00103 查询中的错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06550 和 PLS-00103

ORA-06550、PLS-00103、ORA-06512 函数

oracle - PLS-00103 & ORA -06550 关于程序

ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”:

ORA-06550:第5行,第16列:PLS-00103:当遇到以下情况之一时遇到符号“SELECT”:[重复]

PLS-00103:遇到符号“COLUMNS”