2012-05-02 48 views
12

Oracle SQLの 'Employee'テーブルに値を挿入しようとしています。テーブルに値を挿入する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=3です。営業担当者はpositionsテーブルのposition_id=5です。 Barry Greenはmanagerテーブルのmanager_id=1000です。

参照先の表のテキスト値を入力できるため、Oracleはテキストを認識して関連するIDと一致させることができますか?私はこの質問が理にかなって何かを明確にすることができれば幸いです。

ありがとうございます!

答えて

9

あなたは、挿入する前にDBからより多くのパラメータを引き出すためには、以下の機能を費やすことができます素晴らしい

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

'into p_state_id'を意味しますか? – MatBailie

+0

はい - 良いキャッチ:) – alfasin

+0

これは私が今までに説明したものより少し先進的ですが、私は機能と正確に何をしているのか理解しています。追加されたセキュリティについてもエラーチェックが好きです。ありがとうございました – adohertyd

4

SELECTからテーブルに挿入することができます。この1つは、すべてのルックアップが存在することを前提としていないものの

​​

あるいは、同様に...

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'でない場合、このバージョンでは何も挿入されません。

+0

感謝を。私はOracle 10g XEのスクリプトでこれを実行しているので、レコードが見つからなければエラーが出ると思います。 「フェイルセーフ」方法はありますか、それとも警戒しているだけのケースですか? – adohertyd

+0

@adohertyd - 必要な動作によって異なります。名前の1つが存在しない場合は、NULLの外部キーIDを持つレコードを作成する必要がありますか? *(最初のものがやることです)*または、そのシナリオをキャッチして問題を報告することを好むでしょうか? – MatBailie

+0

私はレポートを好むでしょう。エラーチェックのため。私はAlfasinが以下の彼の関数でそれをカバーしていると思っています – 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' 

スペルミス(または余分なスペース)が1つでも不一致となり、何も挿入されないことに注意してください。

+2

それは 'manager_id = ...'ではなく 'ON manager_name = 'Barry Green''のようなものでなければなりません。(それは検索するものなので) –

+0

@a_horse_with_no_name: 、ありがとう。 – Quassnoi

関連する問題