2009-08-26 10 views
12

मुझे पता है कि ओरेकल मैं आउटपुट पैरामीटर के रूप में एक डाली गई पंक्ति से जेनरेट आईडी (या कोई अन्य कॉलम) प्राप्त कर सकता हूं। पूर्व:ExecuteScalar का उपयोग कर एक डाली गई पंक्ति से जेनरेट आईडी कैसे प्राप्त करें?

insert into foo values('foo','bar') returning id into :myOutputParameter 

वहाँ इसके लिए कोई तरीका ही है, लेकिन ExecuteScalar बजाय ExecuteNonQuery का उपयोग कर?

मैं आउटपुट पैरामीटर या संग्रहीत प्रक्रियाओं का उपयोग नहीं करना चाहता हूं।

ps: मैं ओरेकल का उपयोग कर रहा हूं, एसक्यूएल सर्वर नहीं !!!

+0

एक टिप्पणी यह ​​सट्टा है, लेकिन Sql सर्वर हा "@@ SCOPE_IDENTITY" इतनी बयान हो सकता है के रूप में के रूप में इस लाना "के लिए में डालने ....; चयन @@ SCOPE_IDENTITY" ... ओरेकल कुछ है समान? – Rob

+2

जो उत्तर होगा :) – andrecarlucci

+0

SQL सर्वर के लिए, मुझे इस सिस्टम वैरिएबल @@ SCOPE_IDENTITY के बारे में पता नहीं है, इस प्रकार मुझे एक IDENT_CURRENT स्केलर फ़ंक्शन के बारे में पता है जो समान करता है (SELECT IDENT_CURRENT (N'TableName ') –

उत्तर

6

ओरेकल अपने पहचान कॉलम के लिए दृश्यों का उपयोग करता है, अगर हम ऐसा कह सकते हैं।

यदि आपने अपनी तालिका प्राथमिक कुंजी के लिए अनुक्रम सेट किया है, तो आपको एक ट्रिगर भी लिखना होगा जो अनुक्रमांक .extValue या तो आपके प्राथमिक कुंजी फ़ील्ड में डालेगा।

मान लीजिए कि आप इस अवधारणा से पहले ही परिचित हैं, बस अपने अनुक्रम से पूछें, तो आपको अपना जवाब मिल जाएगा। ओरेकल में बहुत अभ्यास किया जाता है अपने आप को एक ऐसा कार्य करना है जो एक आईएनटी वापस कर देगा, फिर आपके कार्य में, आप अपना आईएनएसईआरटी प्रदर्शन करेंगे। यह मानते हुए कि आपने अपना ट्रिगर सही तरीके से सेटअप किया है, फिर आप इसे पूछकर अपने अनुक्रम का मूल्य वापस कर पाएंगे।

यहाँ एक उदाहरण है:

CREATE TABLE my_table (
    id_my_table INT PRIMARY KEY 
    description VARCHAR2(100) NOT NULL 
) 

CREATE SEQUENCE my_table_seq 
    MINVALUE 1 
    MAXVALUE 1000 
    START WITH 1 
    INCREMENT BY 2 
    CACHE 5; 

प्रबंधित करने के लिए अपने आप को ऑटो को बढ़ा देते चाहते हैं, यहाँ है कि कैसे:

INSERT INTO my_table (
    id_my_table, 
    description 
) VALUES (my_table_seq.NEXTVAL, "Some description"); 
COMMIT; 

दूसरी ओर, यदि आप प्राथमिक के बारे में परवाह नहीं चाहते हैं कुंजी वृद्धि, आप एक ट्रिगर के साथ आगे बढ़ सकते हैं।

CREATE OR REPLACE TRIGGER my_table_insert_trg 
    BEFORE INSERT ON my_table FOR EACH ROW 
BEGIN 
    SELECT my_table_seq.NEXTVAL INTO :NEW.id_my_table FROM DUAL; 
END; 

फिर, जब आप डालने रहे हैं, तो आप बस सम्मिलित बयान इस प्रकार लिखें: एक सम्मिलित करने के बाद

INSERT INTO my_table (description) VALUES ("Some other description"); 
COMMIT; 

, मुझे लगता है कि आप चाहते हैं करने के लिए

SELECT my_table_seq.CURRVAL 

या आपके अनुक्रम के वास्तविक मूल्य का चयन करने के लिए ऐसा कुछ।

http://www.orafaq.com/wiki/Sequence

http://www.orafaq.com/wiki/AutoNumber_and_Identity_columns

आशा इस मदद करता है:

ये कुछ लिंक मदद करने के लिए कर रहे हैं!

+0

हाय विल, अच्छा, मैंने seq.CURRVAL के बारे में नहीं सोचा था। लेकिन क्या यह बचा है? मेरा मतलब है, अगर कोई मेरी दो कॉल (डालने, चयन) के बीच एक पंक्ति डालता है? – andrecarlucci

+0

आमतौर पर इस तरह की घटनाओं को रोकने के लिए इन प्रकार के संचालन आपके डेटाबेस कनेक्शन/सत्र से संबंधित होते हैं। मुझे ओरेकल के लिए काले और सफेद रंग में नहीं मिल रहा है, लेकिन यह तरीका है कि यह MySQL, एक्सेस, एसक्यूएल सर्वर इत्यादि के लिए काम करता है। –

+1

ओरेकल अनुक्रमिक तरीके से आवेषण करेगा। एक बार यह पहले INSERT कथन के माध्यम से हो गया और नया वर्तमान अनुक्रम मूल्य लौटा, यह अन्य सम्मिलन करेगा। जैसा कि श्री क्रेज़ी जो मलोय ने कहा है, इससे कोई फर्क नहीं पड़ता कि वैसे भी ऐसा करने का तरीका क्या है। :) हमें यह नहीं भूलना चाहिए कि ओरेकल एक लेनदेन में काम करता है। इसलिए, अनुक्रम से कोई NEXTVALUE का चयन नहीं किया जाएगा जब तक INSERT कथन COMMITed नहीं है। वैसे भी, अगर मुझे सही याद है, तो लेनदेन करने के दौरान कहीं लॉक (टेबल या सेक्वेंस) की ताकत है। –

24

यदि आप ऑरैकल पर हैं, तो आपको ExecuteNonQuery और ResultParameter का उपयोग करना होगा। इसे प्रश्न के रूप में लिखने का कोई तरीका नहीं है।

using (OracleCommand cmd = con.CreateCommand()) { 
    cmd.CommandText = "insert into foo values('foo','bar') returning id into :myOutputParameter"; 
    cmd.Parameters.Add(new OracleParameter("myOutputParameter", OracleDbType.Decimal), ParameterDirection.ReturnValue); 
    cmd.ExecuteNonQuery(); // an INSERT is always a Non Query 
    return Convert.ToDecimal(cmd.Parameters["myOutputParameter"].Value); 
} 
+0

क्या 'पैरामीटर डायरेक्शन। रीटर्नवेल्यू' और 'पैरामीटर डायरेक्शन। आउटपुट' के बीच का अंतर है? – Timeless

+0

पैरामीटर डायरेक्शन। रीटर्नवैल्यू फ़ंक्शन का नतीजा है। पैरामीटर डायरेक्शन। आउटपुट विधियों (फ़ंक्शंस या प्रक्रियाओं) में पैरामीटर के लिए है जिन्हें आउट या आउटआउट के रूप में परिभाषित किया गया है। – Christian13467

+1

Sigh ! मैं ORA-12537 प्राप्त कर रहा हूं: नेटवर्क सत्र: ExecuteNonQuery पर फ़ाइल का अंत 'कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करता हूं :( –

1

एक संभावित तरीका यदि कोई तालिका में "guid" नामक एक कॉलम जोड़ सकता है: सी # से एक रिकॉर्ड डालने पर, एक guid उत्पन्न करें और इसे गाइड कॉलम पर लिखें। तो उत्पन्न GUID के साथ एक का चयन करते हैं, और आप डाला रिकॉर्ड :) अपने आवश्यक आईडी

0
Select t.userid_pk From Crm_User_Info T 
Where T.Rowid = (select max(t.rowid) from crm_user_info t) 

इस वापस आ जाएगी की आईडी आप नीचे दिए गए कोड का उपयोग कर सकते मिला है।

using (OracleCommand cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = @"INSERT INTO my_table(name, address) 
      VALUES ('Girish','Gurgaon India') 
      RETURNING my_id INTO :my_id_param"; 
     OracleParameter outputParameter = new OracleParameter("my_id_param", OracleDbType.Decimal); 
     outputParameter.Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(outputParameter);   
     cmd.ExecuteNonQuery();   
     return Convert.ToDecimal(outputParameter.Value); 
    } 
संबंधित मुद्दे

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