【问题标题】:Inserting values into tables Oracle SQL向表中插入值 Oracle SQL
【发布时间】:2012-05-12 09:58:50
【问题描述】:

我正在尝试将值插入 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 表中是state_id=3positions表中的销售主管是position_id=5; Barry Green 在manager 表中是manager_id=1000

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

谢谢!

【问题讨论】:

    标签: sql oracle database-design insert-into


    【解决方案1】:

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

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

    【讨论】:

    • 你的意思是into p_state_id
    • 这比我到目前为止所介绍的要先进一些,但我了解这些功能以及您在做什么。我也喜欢错误检查以增加安全性。谢谢你
    • 对于这样的东西,我更喜欢创建一个函数/过程,然后用参数调用它,否则一个相当简单的插入 sql 可能会变成一个怪物......
    • 只是觉得这里函数的使用和异常处理有点多余。如果它被创建为一个过程并且发生了异常,那么这个异常将传播到调用过程......你也会知道异常是什么!
    • @MikeMeyers - 我怀疑这可能是从经验中学习的案例。
    【解决方案2】:
    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'
    

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

    【讨论】:

    • 它可能应该类似于ON manager_name = 'Barry Green',而不是manager_id = ...(因为这是应该检索的)
    【解决方案3】:

    您可以从 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'
    

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

    【讨论】:

    • 谢谢,太好了。我在 Oracle 10g XE 的脚本中运行它,所以我认为如果找不到记录,它会抛出一些错误。是否有“故障安全”方法,还是只是保持警惕?
    • @adohertyd - 这取决于你想要的行为。如果其中一个名称不存在,是否应该使用 NULL 外键 id 创建记录? (这就是第一个会做的事情。) 或者您更愿意捕捉这种情况并报告问题?
    • 我希望收到一份报告。仅用于错误检查。我认为 Alfasin 已经在下面的函数中介绍了它
    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多