2011-11-18 17 views
5

मुझे एक SQL क्वेरी के साथ समस्या हो रही है। यदि एक ही पंक्ति पहले से मौजूद नहीं है तो मुझे एक पंक्ति डालने की आवश्यकता है।वर्ग - यदि मौजूद नहीं है तो

DECLARE 
BEGIN 
    FOR FOLDER_ROW IN (SELECT FOLDERID, USERID FROM DATA1.FOLDERS) 
     LOOP      
      IF NOT EXISTS (SELECT * FROM DATA1.FOLDER_USER WHERE FOLDER_ID = FOLDER_ROW.FOLDERID AND USER_ID = FOLDER_ROW.USERID) 
      INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, USER_ID) VALUES (FOLDER_ROW.FOLDERID, FOLDER_ROW.USERID); 
    END LOOP; 
    COMMIT; 
END; 

मैं एसक्यूएल साथ बहुत परिचित नहीं होगा विशेष रूप से मौजूद नहीं वाक्य रचना इसलिए जब मैं निष्पादित मैं निम्नलिखित त्रुटि मिलती है: "फिर"

ORA-06550: line 37, column 11: PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:

then and or

प्रतीक यह वही है मैं अब तक किया है जारी रखने के लिए "INSERT" के लिए प्रतिस्थापित किया गया था।

ORA-06550: line 38, column 10: 
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: 

    if 
ORA-06550: line 40, column 5: 
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: 

    end not pragma final instantiable order overriding static 
    member constructor map 

उत्तर

12

यह सब क्या एसक्यूएल में बजाय संदर्भ PL/SQL में स्विच: (? ओरेकल विशिष्ट)

INSERT INTO DATA1.FOLDERS 
(folder_id, 
user_id) 
SELECT f1.folder_id, 
     f1.user_id 
    FROM DATA1.FOLDERS f1 
WHERE NOT EXISTS (SELECT 1 
        FROM DATA1.FOLDERS f2 
        WHERE f1.folder_id = f2.folder_id 
         AND f1.user_id = f2.user_id); 
+1

++ 1 'अगर मौजूद है() ... INSERT' आमतौर पर परमाणु नहीं, एक परस्पर विरोधी रिकॉर्ड अर्थ अस्तित्व की जांच और डालने के बीच डाला जा सकता है। –

+0

@ एमएम - ओरेकल में एक एसक्यूएल कथन हमेशा परमाणु है। यदि कोई अनन्य अनुक्रमणिका नहीं है, तो आप विवादों के साथ समाप्त हो सकते हैं क्योंकि डाला गया एक और सत्र पंक्ति को नहीं देखता क्योंकि पहले सत्र ने इसे अभी तक नहीं किया था। –

+0

मैं ओरेकल के व्यवहार से यहां बात नहीं कर सकता, लेकिन इसके लिए आपका शब्द लेगा। मुझे कुछ डीबीएमएस का इलाज पता है 'अगर पूर्व (...) फिर' और 'इन्हें दो में दो बयानों के रूप में, एक नहीं, लेकिन यह लेनदेन अलगाव स्तर और साथ ही साथ निर्भर करता है। –

1

आप तो भूल गया

IF condition THEN 
    ... 
ELSE 
    ... 
END IF; 
2

एक बेहतर समाधान हो सकता है मेर्ज स्टेटमेंट बनें।

एक अच्छा विवरण के लिए यहाँ देखें, उदाहरण के साथ:

http://www.oracle-base.com/articles/10g/MergeEnhancements10g.php

आशा है कि मदद करता है।

+1

'मेर्ज' ओरेकल-विशिष्ट नहीं है। यह वास्तव में 'एसक्यूएल: 2008' का हिस्सा है। उदाहरण के लिए, [डीबी 2] (http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0010873.html) (कम से कम चूंकि जेड/ओएस के लिए v9, और LUW के लिए 9.5) और [SQL सर्वर] (http://technet.microsoft.com/en-us/library/bb510625.aspx), 2008 से। – bhamby

+0

धन्यवाद गैलेडोर, मैं सुंदर हूँ विशेष रूप से ओरेकल लड़का, इसलिए मुझे यकीन नहीं था कि अगर एमईजीईजी एसक्यूएल मानक या ओरेकल एक्सटेंशन था। स्पष्टीकरण के लिए धन्यवाद। –

0
DECLARE 
    N_COUNTS NUMBER; 
BEGIN 
    select count(ID) into N_COUNTS from TABLE_NAME where ID = 1; 
    IF N_COUNTS=0 THEN 
     INSERT QUERY.... 
    ELSE 
     UPDATE QUERY.... 
    END IF; 
END; 
संबंधित मुद्दे