【问题标题】:INSERT into statement not working in oracle when using INSERT INTO .. SELECT * FROM使用 INSERT INTO .. SELECT * FROM 时,INSERT into 语句在 oracle 中不起作用
【发布时间】:2019-10-26 13:31:38
【问题描述】:

我有vh_emp 表,其表结构是(这是空表):

我正在从 employee 表中获取数据作为源表,我在其中编写了一些查询以匹配 vh_emp 表:

SELECT e.emp_id       EMP_ID, 
       e.emp_name     EMP_NAME, 
       e.dob          DOB, 
       e.join_date    JOIN_DATE, 
       CASE 
         WHEN e.leave_date IS NULL THEN Trunc(sysdate) 
         ELSE e.leave_date 
       END            AS LEAVE_DATE, 
       e.salary / 100 SALARY, 
       d.dept_name    DEPT_NAME, 
       one.addr_name  ADDRESS_ONE, 
       two.addr_name  ADDRESS_TWO, 
       b.emp_name     AS MANAGER_NAME 
FROM   offc.employee e 
       LEFT JOIN offc.department d 
              ON e.dept_id = d.dept_id 
       LEFT JOIN offc.add_line_one one 
              ON e.line1 = one.addr_id_one 
       LEFT JOIN offc.add_line_two two 
              ON e.line2 = two.addr_id_two 
       LEFT OUTER JOIN (SELECT * 
                        FROM   offc.employee) b 
                    ON e.manager_id = b.emp_id; 

查询运行良好,该查询的输出也正常:

所以,我想将这些数据插入到vh_emp 表中:

INSERT INTO offc.vh_emp 
            (emp_id, 
             emp_name, 
             dob, 
             join_date, 
             leave_date, 
             address_one, 
             address_two, 
             salary, 
             manager_name, 
             dept_name) 
SELECT e.emp_id       EMP_ID, 
       e.emp_name     EMP_NAME, 
       e.dob          DOB, 
       e.join_date    JOIN_DATE, 
       CASE 
         WHEN e.leave_date IS NULL THEN Trunc(sysdate) 
         ELSE e.leave_date 
       END            AS LEAVE_DATE, 
       e.salary / 100 SALARY, 
       d.dept_name    DEPT_NAME, 
       one.addr_name  ADDRESS_ONE, 
       two.addr_name  ADDRESS_TWO, 
       b.emp_name     AS MANAGER_NAME 
FROM   offc.employee e 
       LEFT JOIN offc.department d 
              ON e.dept_id = d.dept_id 
       LEFT JOIN offc.add_line_one one 
              ON e.line1 = one.addr_id_one 
       LEFT JOIN offc.add_line_two two 
              ON e.line2 = two.addr_id_two 
       LEFT OUTER JOIN (SELECT * 
                        FROM   offc.employee) b 
                    ON e.manager_id = b.emp_id; 

但是,我执行了这个查询我得到了错误:

ORA-01722: invalid number

employee的结构为:

为什么会出现这个错误?我查看并看到 select 语句的列和值的数据类型相同。由于列数据类型匹配,因此不应出现此错误。

【问题讨论】:

    标签: sql oracle oracle11g sql-insert


    【解决方案1】:

    insert 子句列名和select 子句列名的顺序应该匹配。

    请按如下方式匹配他们的位置:

    INSERT INTO offc.vh_emp 
                (emp_id, 
                 emp_name, 
                 dob, 
                 join_date, 
                 leave_date, 
                 Salary,  -- this
                 dept_name, -- this
                 address_one, 
                 address_two,
                 manager_name 
                 ) 
    SELECT e.emp_id       EMP_ID, 
           e.emp_name     EMP_NAME, 
           e.dob          DOB, 
           e.join_date    JOIN_DATE, 
           CASE 
             WHEN e.leave_date IS NULL THEN Trunc(sysdate) 
             ELSE e.leave_date 
           END            AS LEAVE_DATE, 
           e.salary / 100 SALARY, 
           d.dept_name    DEPT_NAME, 
           one.addr_name  ADDRESS_ONE, 
           two.addr_name  ADDRESS_TWO, 
           b.emp_name     AS MANAGER_NAME 
    FROM   offc.employee e 
           LEFT JOIN offc.department d 
                  ON e.dept_id = d.dept_id 
           LEFT JOIN offc.add_line_one one 
                  ON e.line1 = one.addr_id_one 
           LEFT JOIN offc.add_line_two two 
                  ON e.line2 = two.addr_id_two 
           LEFT OUTER JOIN (SELECT * 
                            FROM   offc.employee) b 
                        ON e.manager_id = b.emp_id; 
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2022-08-02
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多