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暗黙的にその列に値を入れているため、値を日付に変換できないため、について不平を言っていると思います。djobempdjob

コメントに基づいて更新します。テーブルを作成したと言った方法から、これは次と同等です。

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

余談ですが、ローカル変数を宣言するときに、テーブルに基づいてdno emp.empno%TYPEそれらを指定できます。また、あなたのコメントに基づいて、混乱を避けるためにローカル変数にテーブルの列に異なる名前を付けることをお勧めします。

selecta_horse_with_no_name が言ったように、これは単純な SQL 挿入で実行でき、PL/SQL ブロック内であっても別の 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 に答える