2012-05-02 26 views
12

Estoy tratando de insertar valores en una tabla 'Empleado' en Oracle SQL. Tengo una pregunta sobre la entrada de valores determinada por una clave externa:Insertar valores en tablas Oracle SQL

Mis empleados tienen 3 atributos que se determinan mediante claves externas: Estado, Posición, & Administrador. Estoy usando una declaración INSERT INTO para insertar los valores y escribir manualmente los datos. ¿Debo buscar físicamente cada referencia para ingresar los datos o hay un comando que pueda usar? P.ej.

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) 

Esto debe rellenar la tabla empleado con (John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green). Nueva York es state_id=3 en la tabla State; El ejecutivo de ventas es position_id=5 en la tabla positions; y Barry Green es manager_id=1000 en la tabla manager.

¿Hay alguna manera de que pueda ingresar los valores de texto de las tablas referenciadas, para que Oracle reconozca el texto y lo combine con la ID correspondiente? Espero que esta pregunta tenga sentido. Me complacerá aclarar cualquier cosa.

Gracias!

Respuesta

9

Usted puede gastar la siguiente función con el fin de sacar más parámetros de la base de datos antes de la inserción:

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

¿Quiere decir 'into p_state_id'? – MatBailie

+0

sí - buena captura :) – alfasin

+0

Esto es un poco más avanzado que lo que he cubierto hasta ahora pero entiendo las funciones y exactamente lo que está haciendo. Me gusta el error también para la seguridad adicional. Gracias por esto – adohertyd

4

Puede insertar en una tabla desde un SELECCIONAR.

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 

O, de manera similar ...

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' 

Aunque éste no asuma que existen todos los look-ups. Si, por ejemplo, no hay un nombre de posición 'Ejecutivo de ventas', no se insertaría nada con esta versión. se insertará

+0

Gracias eso es genial. Estoy ejecutando esto en un script en Oracle 10g XE, así que creo que arrojará algunos errores si no se encuentra ningún registro. ¿Hay un método 'a prueba de fallas' o es solo un caso de estar atentos? – adohertyd

+0

@adohertyd - Depende del comportamiento que desee. Si uno de los nombres no existe, ¿debería crear el registro con una ID de clave externa NULL? * (Eso es lo que hará el primero.) * ¿O preferiría captar ese escenario e informar un problema? – MatBailie

+0

Preferiría un informe de vuelta. Solo para verificar errores. Creo que Alfasin lo ha cubierto en su función a continuación, aunque – adohertyd

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' 

Tenga en cuenta que más que un solo error de ortografía (o un espacio extra) darán como resultado una no coincidencia y nada.

+2

Probablemente debería ser algo como 'ON manager_name = 'Barry Green'', no' manager_id = ... '(porque eso es lo que debería recuperarse) –

+0

@a_horse_with_no_name: por supuesto , Gracias. – Quassnoi

Cuestiones relacionadas