2012-05-02 18 views
12

Sto cercando di inserire valori in una tabella 'Dipendente' in Oracle SQL. Ho una domanda riguardante l'immissione di valori determinati da una chiave esterna:Inserimento di valori nelle tabelle Oracle SQL

I miei dipendenti hanno 3 attributi determinati da chiavi esterne: Stato, Posizione, & Manager. Sto usando una dichiarazione INSERT INTO per inserire i valori e digitare manualmente i dati. Devo cercare fisicamente ogni riferimento per inserire i dati o c'è un comando che posso usare? Per esempio.

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) 

Questo dovrebbe popolare la tabella dei dipendenti con (John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green). New York è state_id=3 nella tabella State; Il responsabile vendite è position_id=5 nella tabella positions; e Barry Green è manager_id=1000 nella tabella manager.

C'è un modo in cui posso immettere i valori di testo delle tabelle di riferimento, in modo che Oracle riconoscerà il testo e lo abbinerà all'ID pertinente? Spero che questa domanda abbia senso sarà felice di chiarire qualsiasi cosa.

Grazie!

risposta

9

È possibile consumare la seguente funzione al fine di tirare fuori più parametri dal DB prima che l'inserto:

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

Intendi "in p_state_id'? – MatBailie

+0

sì - buona cattura :) – alfasin

+0

Questo è leggermente più avanzato di quello che ho coperto finora ma capisco le funzioni e esattamente quello che stai facendo. Mi piace anche il controllo degli errori per la sicurezza aggiunta. Grazie per questo – adohertyd

4

È possibile inserire in una tabella da un 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 

Oppure, allo stesso modo ...

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' 

Anche se questo non supporre che esistano tutti i look-up. Se, ad esempio, non esiste un nome di posizione "Sales Executive", nulla verrebbe inserito con questa versione. sarà inserito

+0

Grazie che è grande. Sto eseguendo questo in uno script in Oracle 10g XE, quindi penso che genererà alcuni errori se non viene trovato alcun record. Esiste un metodo "fail safe" o è solo un caso di essere vigili? – adohertyd

+0

@adohertyd - Dipende dal comportamento che si desidera. Se uno dei nomi non esiste, dovrebbe creare il record con un ID chiave straniera NULL? * (Questo è quello che farà il primo.) * O preferiresti prendere lo scenario e riportare un problema? – MatBailie

+0

Preferirei un rapporto indietro. Solo per il controllo degli errori. Penso che Alfasin lo abbia coperto nella sua funzione in basso anche se – 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' 

Si noti che, ma un singolo errore di ortografia (o uno spazio extra) si tradurrà in un non-partita e nulla.

+2

Probabilmente dovrebbe essere qualcosa come 'ON manager_name = 'Barry Green'', non' manager_id = ... '(perché è quello che dovrebbe essere recuperato) –

+0

@a_horse_with_no_name: ovviamente , Grazie. – Quassnoi

Problemi correlati