无法解决 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-06512 函数
oracle - PLS-00103 & ORA -06550 关于程序
ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”: