2012-05-02 30 views
12

Tôi đang cố chèn các giá trị vào bảng 'Employee' trong Oracle SQL. Tôi có câu hỏi về nhập các giá trị được xác định bằng khóa ngoài:Chèn các giá trị vào các bảng Oracle SQL

Nhân viên của tôi có 3 thuộc tính được xác định bằng khóa ngoài: Trạng thái, Vị trí, & Trình quản lý. Tôi đang sử dụng câu lệnh INSERT INTO để chèn các giá trị và nhập thủ công dữ liệu. Tôi có cần phải tìm kiếm vật lý mỗi tài liệu tham khảo để nhập dữ liệu hoặc là có một lệnh mà tôi có thể sử dụng? Ví dụ.

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) 

Điều này sẽ điền bảng nhân viên với (John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green). New York là state_id=3 trong bảng State; Nhân viên kinh doanh là position_id=5 trong bảng positions; và Barry Green là manager_id=1000 trong bảng manager.

Có cách nào để tôi có thể nhập giá trị văn bản của các bảng được tham chiếu để Oracle nhận dạng văn bản và khớp với văn bản có ID liên quan không? Tôi hy vọng câu hỏi này có ý nghĩa sẽ được hạnh phúc để làm rõ bất cứ điều gì.

Cảm ơn!

Trả lời

9

Bạn có thể rộng các chức năng sau đây để kéo ra nhiều tham số từ DB trước khi chè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

Bạn có nghĩa là 'vào p_state_id'? – MatBailie

+0

yes - tốt bắt :) – alfasin

+0

Điều này là cao hơn một chút so với những gì tôi đã bảo hiểm cho đến bây giờ nhưng tôi hiểu các chức năng và chính xác những gì bạn đang làm. Tôi thích kiểm tra lỗi quá cho bảo mật được thêm vào. Cảm ơn vì điều này – adohertyd

4

Bạn có thể chèn vào bảng từ 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 

Hoặc tương tự ...

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' 

Mặc dù một điều này giả định rằng tất cả các look-up tồn tại. Ví dụ: nếu không có tên vị trí 'Nhân viên bán hàng', không có gì sẽ được chèn vào với phiên bản này.

+0

Nhờ đó thật tuyệt. Tôi đang chạy này trong một kịch bản trong Oracle 10g XE vì vậy tôi nghĩ rằng nó sẽ ném ra một số lỗi nếu không có hồ sơ được tìm thấy. Có phương pháp 'không an toàn' hay chỉ là một trường hợp cảnh giác? – adohertyd

+0

@adohertyd - Tùy thuộc vào hành vi bạn muốn. Nếu một trong các tên không tồn tại, nó sẽ tạo bản ghi với một id khóa ngoài NULL? * (Đó là điều đầu tiên sẽ làm.) * Hay bạn muốn bắt kịch bản đó và báo cáo lại một vấn đề? – MatBailie

+0

Tôi muốn có báo cáo trở lại. Chỉ để kiểm tra lỗi. Tôi nghĩ rằng Alfasin đã bao phủ nó trong chức năng của mình dưới đây mặc dù – 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' 

Lưu ý rằng một sai lầm chính tả đơn lẻ (hoặc khoảng trống thừa) sẽ cho kết quả không khớp và không có gì sẽ được chèn vào.

+2

Nó có lẽ nên là một cái gì đó như 'ON manager_name = 'Barry Green'', không phải' manager_id = ... '(vì đó là những gì nên được lấy ra) –

+0

@a_horse_with_no_name: tất nhiên , cảm ơn. – Quassnoi