Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle SQL表中插入值_Sql_Oracle_Database Design_Insert Into - Fatal编程技术网

在Oracle SQL表中插入值

在Oracle SQL表中插入值,sql,oracle,database-design,insert-into,Sql,Oracle,Database Design,Insert Into,我正在尝试将值插入到Oracle SQL中的“Employee”表中。我对输入外键确定的值有疑问: 我的员工有3个由外键决定的属性:状态、职位和经理。我正在使用INSERT-INTO语句插入值并手动键入数据。我是否需要实际查找每个引用以输入数据,或者是否有可以使用的命令?例如 INSERT INTO Employee (emp_id, emp_name, emp_address, emp_state, emp_position, emp_manager) VALUES (001, "John

我正在尝试将值插入到Oracle SQL中的“Employee”表中。我对输入外键确定的值有疑问:

我的员工有3个由外键决定的属性:状态、职位和经理。我正在使用
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)
这应该在employee表中填入
(John Doe,纽约格林街River Walk 1号,Barry Green销售主管)
。纽约州在
表中为
州_id=3
;销售主管在
职位
表中的
职位id=5
;巴里·格林在
manager
表中是
manager\u id=1000

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


谢谢

您可以从选择项插入到表中

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'
虽然这一个确实假设所有的查找都存在。例如,如果没有职位名称“Sales Executive”,则此版本不会插入任何内容

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'

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

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

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

它应该是类似于
ON manager\u name='Barry Green'
,而不是
manager\u id=…
(因为这就是应该检索的内容)你的意思是
进入p\u state\u id
?这比我现在所说的稍微高级一点,但我理解其功能和你正在做的事情。为了增加安全性,我也喜欢错误检查。感谢诸如此类的东西,我更喜欢创建一个函数/过程,然后用参数调用它,否则一个相当简单的insert sql可能会变成一个怪物……只是认为函数的使用和异常处理在这里有点不必要。如果这是作为过程创建的,并且发生异常,则该异常将传播到调用过程。。。。你也会知道例外是什么@MikeMeyers-我怀疑这可能是一个从经验中学习的案例。谢谢,这太好了。我在Oracle10gXe中的脚本中运行这个,所以我认为如果找不到记录,它会抛出一些错误。有“故障安全”的方法吗?还是仅仅是一种保持警惕的方法?@adohertyd-这取决于你想要的行为。如果其中一个名称不存在,是否应使用空外键id创建记录?(这是第一个会做的。)或者你更愿意抓住这个场景并报告一个问题吗?我更愿意报告。只是为了检查错误。我认为阿尔法辛在下面的函数中已经涵盖了这一点