用于插入表的plsql

时间:2012-11-15 10:31:47

标签: oracle plsql

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.

我不明白错误是什么。

1 个答案:

答案 0 :(得分:1)

从错误消息中看起来您正在将值插入错误的列中。没有看到你的表结构(例如来自describe newmpl)这是一个猜测,但这句话:

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

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

根据评论进行更新:从您创建表格的方式来看,这相当于:

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);

另外,在声明您的局部变量时,您可以指定它们based on the table,例如dno emp.empno%TYPE。另外,根据您的评论,我建议为表格列提供不同的名称,以避免混淆。

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

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在哪里适合。