oracle - PL/SQL 中的错误“必须声明标识符”是什么意思?
问题描述
任务是编写用于输入新员工的 PL/SQL 块,抛出 Oracle 数据库用户对话框以将数据插入表中。我真的不明白我在这里缺少什么:
SET SERVEROUTPUT ON
ACCEPT empno PROMPT 'Enter empno: '
ACCEPT ename PROMPT 'Enter ename: '
ACCEPT job PROMPT 'Enter job: '
ACCEPT mgr PROMPT 'Enter mgr: '
ACCEPT sal PROMPT 'Enter sal: '
ACCEPT deptno PROMPT 'Enter deptno: '
DECLARE
empn NUMBER := &empno;
ena VARCHAR(255) := &ename;
ejob VARCHAR(255) := &job;
emgr NUMBER := &mgr;
ehire DATE := Sysdate;
esal NUMBER := &sal;
ecomm NUMBER := null;
edeptno NUMBER := &deptno;
BEGIN
INSERT INTO EMP(EMPNO, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (empn, ena, ejob, emgr, ehire, esal, ecomm, edeptno);
END;
错误报告:
Error report - ORA-06550: line 3, column 21: PLS-00201: identifier 'ANDREW' must be declared ORA-06550: line 3, column 5: PL/SQL: Item ignored ORA-06550: line 4, column 22: PLS-00201: identifier 'MANAGER' must be declared ORA-06550: line 4, column 6: PL/SQL: Item ignored ORA-06550: line 11, column 17: PL/SQL: ORA-00913: too many values ORA-06550: line 11, column 5: PL/SQL: SQL Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:
你能解释一下,我的代码中有什么错误吗?
我尝试了以下方法:
SET SERVEROUTPUT ON
ACCEPT empno PROMPT 'Enter empno: '
ACCEPT ename PROMPT 'Enter ename: '
ACCEPT job PROMPT 'Enter job: '
ACCEPT mgr PROMPT 'Enter mgr: '
ACCEPT sal PROMPT 'Tneter sal: '
ACCEPT deptno PROMPT 'Enter deptno: '
DECLARE
empn NUMBER := '&empno';
ena VARCHAR(255) := '&ename';
ejob VARCHAR(255) := '&job';
emgr NUMBER := '&mgr';
ehire DATE := Sysdate;
esal NUMBER := '&sal';
ecomm NUMBER := null;
edeptno NUMBER := '&deptno;
BEGIN
INSERT INTO EMP(EMPNO, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (empn, ena, ejob, emgr, ehire, esal, ecomm, edeptno);
END;
错误:
Error report -
ORA-06550: line 9, column 19:
PLS-00103: Encountered the symbol "30;
BEGIN
INSERT INTO EMP(EMPNO, JOB, MGR, HIREDATE, SAL, CO" when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted string
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
解决方案
使用您的输入替换替换变量。例如,变为:
ena VARCHAR(255) := &ename;
ena VARCHAR(255) := ANDREW;
这是错误。缺少单引号。
所以正确的是:
ena VARCHAR(255) := '&ename';
您还应该指定数据类型和格式掩码。例如:
ACCEPT esal NUMBER FORMAT '999.99'
ACCEPT hired DATE FORMAT 'dd/mm/yyyy'
推荐阅读
- mysql - 'ipa [ irs' 的错误参数#1(预期的表,得到布尔值)
- amazon-ecs - 没有公有子网的 VPC 中的内部 ALB
- javascript - 如何每分钟更新此网页?
- r - 大型 JSON 对象解析失败 (rtweet)
- react-final-form - 更新 react-final-form 中的表单状态
- laravel - 在 vuejs 中评论帖子时禁用循环中的所有文本区域
- objective-c - 你如何在 Xcode for iOS 12.0 中抑制 OpenGL 消息
- python - 在无限循环中运行python plotly动画
- python - 使用基于新系列和现有列的格式在 DataFrame 中使用 MultiIndex 列构建新的字符串列
- java - 如何在第一个活动中单击下一个活动中的按钮时打开 alertDialog