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) 解决问题,当调用一个以数字命名的属性时,使用立即执行。