0
declare

dno number(4);
dname varchar2(5);
ddate date;
dbasic number(10);
djob varchar2(15);
dcomm number(5);
dept  number(5);
dmgr  number(5);

begin
select empno,ename,hiredate,sal,job1,comm,deptno,mgr
into dno,dname,ddate,dbasic,djob,dcomm,dept,dmgr
from emp
where empno=&userno;
if sql%rowcount>0
then
   insert into newempl
   values(dno,dname,djob,dmgr,ddate,dbasic,dcomm,dept);
   dbms_output.put_line('records inserted into it');
   dbms_output.put_line(dno||' '||dname||' '||ddate||' '||dbasic);
   end if;
   end;

错误报告:

ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 19
01858. 00000 -  "a non-numeric character was found where a numeric was expected"
*Cause:    The input data to be converted using a date format model was
           incorrect.  The input data did not contain a number where a number was
           required by the format model.
*Action:   Fix the input data or the date format model to make sure the
           elements match in number and type.  Then retry the operation.

我不明白错误是什么。

4

1 回答 1

1

从错误消息看来,您将值插入到错误的列中。在没有看到您的表结构(describe newmpl例如)的情况下,这有点猜测,但是这个声明:

insert into newempl
values(dno,dname,djob,dmgr,ddate,dbasic,dcomm,dept);

...假设newempl表中的列按特定顺序排列,但可能不是(并且似乎不是)情况。更具体地说,我认为它在抱怨hiredate,因为您隐含地将djob值放在该列中 - 假设新表看起来像emp- 并且该djob值无法转换为日期。

根据评论更新:根据您所说的创建表的方式,这相当于:

insert into newempl(dno, dname, ddate, dbasic, djob, dcomm, dept, dmgr)
values(dno,dname,djob,dmgr,ddate,dbasic,dcomm,dept);

...因此您可以看到,当它的布局像列未对齐时,您确实在尝试将您的djob值放入ddate列中,这是行不通的。

明确指定列总是更安全,既可以防止在不同环境中出现不同排序的问题(尽管受控代码不应该真正发生这种情况),也可以防止在添加新列时出现这种情况。就像是:

insert into newempl(empno,ename,jon1,mgr,hiredate,sal,comm,deptno)
values(dno,dname,djob,dmgr,ddate,dbasic,dcomm,dept);

顺便说一句,在声明局部变量时,您可以基于 table指定它们,例如dno emp.empno%TYPE. 另外,根据您的评论,我建议为表列赋予局部变量不同的名称以避免混淆。

正如 a_horse_with_no_name 所说,这可以通过简单的 SQL 插入来完成,甚至在 PL/SQL 块中也不需要单独select的 andinsert语句;你可以这样做:

insert into newempl(empno,ename,jon1,mgr,hiredate,sal,comm,deptno)
select empno,ename,jon1,mgr,hiredate,sal,comm,deptno
from emp
where empno=&userno;

不幸的是,这些都没有解决“必须将作为经理的员工插入新表”的要求,因为您没有对该mgr列执行任何操作。不过,我认为此时为您完成这部分任务不会有建设性,而且我不确定在哪里&userno适合。

于 2012-11-15T12:35:21.497 回答