12

我正在尝试将值插入 Oracle SQL 中的“员工”表中。我有一个关于输入由外键确定的值的问题:

我的员工有 3 个由外键确定的属性:State、Position 和 Manager。我正在使用INSERT INTO语句插入值并手动输入数据。我是否需要物理查找每个引用以输入数据,或者是否有可以使用的命令?例如

INSERT INTO Employee 
(emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
VALUES 
(001, "John Doe", "1 River Walk, Green Street", 3, 5, 1000)

这应该用 填充员工表(John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green)。纽约state_id=3State表中;销售主管position_id=5positions表中;巴里格林manager_id=1000manager桌子上。

有没有一种方法可以输入引用表的文本值,以便 Oracle 识别文本并将其与相关 ID 匹配?我希望这个问题有意义,我很乐意澄清任何事情。

谢谢!

4

3 回答 3

8

您可以扩展以下功能,以便在插入之前从数据库中提取更多参数:

--
-- insert_employee  (Function) 
--
CREATE OR REPLACE FUNCTION insert_employee(p_emp_id in number, p_emp_name in varchar2, p_emp_address in varchar2, p_emp_state in varchar2, p_emp_position in varchar2, p_emp_manager in varchar2) 
RETURN VARCHAR2 AS

   p_state_id varchar2(30) := '';
 BEGIN    
      select state_id 
      into   p_state_id
      from states where lower(emp_state) = state_name;

      INSERT INTO Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager) VALUES 
                (p_emp_id, p_emp_name, p_emp_address, p_state_id, p_emp_position, p_emp_manager);

    return 'SUCCESS';

 EXCEPTION 
   WHEN others THEN
    RETURN 'FAIL';
 END;
/
于 2012-05-02T21:45:04.110 回答
7
INSERT
INTO    Employee 
        (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT  '001', 'John Doe', '1 River Walk, Green Street', state_id, position_id, manager_id
FROM    dual
JOIN    state s
ON      s.state_name = 'New York'
JOIN    positions p
ON      p.position_name = 'Sales Executive'
JOIN    manager m
ON      m.manager_name = 'Barry Green'

请注意,一个拼写错误(或额外的空格)将导致不匹配,并且不会插入任何内容。

于 2012-05-02T21:42:43.703 回答
4

您可以从 SELECT 插入到表中。

INSERT INTO
  Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT
  001,
  'John Doe',
  '1 River Walk, Green Street',
  (SELECT id FROM state WHERE name = 'New York'),
  (SELECT id FROM positions WHERE name = 'Sales Executive'),
  (SELECT id FROM manager WHERE name = 'Barry Green')
FROM
  dual

或者,类似地...

INSERT INTO
  Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager)
SELECT
  001,
  'John Doe',
  '1 River Walk, Green Street',
  state.id,
  positions.id,
  manager.id
FROM
  state
CROSS JOIN
  positions
CROSS JOIN
  manager
WHERE
      state.name     = 'New York'
  AND positions.name = 'Sales Executive'
  AND manager.name   = 'Barry Green'

尽管这确实假设所有查找都存在。例如,如果没有职位名称“销售主管”,则此版本不会插入任何内容。

于 2012-05-02T21:41:10.207 回答