2012-05-02 11 views
12

मैं ओरेकल एसक्यूएल में 'कर्मचारी' तालिका में मान डालने की कोशिश कर रहा हूं। मेरे पास एक विदेशी कुंजी द्वारा निर्धारित मूल्यों को इनपुट करने के बारे में एक प्रश्न है:तालिकाओं में मान डालना ओरेकल एसक्यूएल

मेरे कर्मचारियों के पास 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) 

यह कर्मचारी तालिका को (John Doe, 1 River Walk, Green Street, New York, Sales Executive, Barry Green) के साथ पॉप्युलेट करना चाहिए। State तालिका में न्यू यॉर्क state_id=3 है; positions तालिका में बिक्री कार्यकारी position_id=5 है; और बैरी ग्रीन manager तालिका में है।

क्या कोई तरीका है जिसमें मैं संदर्भित तालिकाओं के टेक्स्ट मान इनपुट कर सकता हूं, ताकि ओरेकल टेक्स्ट को पहचान सके और प्रासंगिक आईडी से मेल खा सके? मुझे आशा है कि इस सवाल से कुछ भी स्पष्ट करने में खुशी होगी।

धन्यवाद!

उत्तर

9

आपको डालने से पहले डीबी से अधिक पैरामीटर बाहर निकलने के लिए में निम्नलिखित समारोह व्यय कर सकते हैं:

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

क्या आपका मतलब है 'p_state_id' में? – MatBailie

+0

हाँ - अच्छी पकड़ :) – alfasin

+0

यह अब तक जो कुछ मैंने कवर किया है उससे थोड़ा अधिक उन्नत है, लेकिन मैं कार्यों को समझता हूं और वास्तव में आप क्या कर रहे हैं। मुझे अतिरिक्त सुरक्षा के लिए भी त्रुटि जांचना पसंद है। इस – adohertyd

4

आप एक चयन से एक तालिका में सम्मिलित कर सकते हैं।

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' 

हालांकि यह एक ग्रहण करता है कि सभी लुक-अप मौजूद हैं। यदि, उदाहरण के लिए, 'सेल्स एक्जीक्यूटिव' नाम की कोई स्थिति नहीं है, तो इस संस्करण के साथ कुछ भी नहीं डाला जाएगा।

+0

धन्यवाद तो बढ़िया है। मैं इसे ओरेकल 10 जी एक्सई में एक स्क्रिप्ट में चला रहा हूं, इसलिए मुझे लगता है कि अगर कोई रिकॉर्ड नहीं मिलता है तो यह कुछ त्रुटियों को फेंक देगा। क्या कोई 'असफल सुरक्षित' विधि है या क्या यह सतर्क होने का मामला है? – adohertyd

+0

@adoherty - यह आपके इच्छित व्यवहार पर निर्भर करता है। यदि नामों में से कोई एक अस्तित्व में नहीं है, तो क्या इसे एक पूर्ण विदेशी कुंजी आईडी के साथ रिकॉर्ड बनाना चाहिए? * (यही वह पहला होगा जो करेगा।) * या आप उस परिदृश्य को पकड़ना और किसी समस्या की रिपोर्ट करना पसंद करेंगे? – MatBailie

+0

मैं एक रिपोर्ट वापस पसंद करूंगा। बस त्रुटि जांच के लिए। मुझे लगता है कि अल्फासिन ने इसे नीचे दिए गए अपने कार्य में कवर किया है हालांकि – 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' 

ध्यान दें कि एक वर्तनी गलती (या एक अतिरिक्त स्थान) के परिणामस्वरूप एक गैर-मैच होगा और कुछ भी नहीं डाला जाएगा।

+2

यह संभवतः 'ON manager_name =' बैरी ग्रीन 'जैसा होना चाहिए,' manager_id = ... '(क्योंकि यह वही है जिसे पुनर्प्राप्त किया जाना चाहिए) –

+0

@a_horse_with_no_name: बेशक , धन्यवाद। – Quassnoi

संबंधित मुद्दे