我从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;
答案 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;等符号)调用属性时,解决问题。