2016-01-15 6 views
8

ओरेकल 12 सी के बाद से हम पहचान फ़ील्ड का उपयोग कर सकते हैं।ओरेकल पिछली डाली गई पहचान

क्या अंतिम डाली गई पहचान (यानी select @@identity या select LAST_INSERTED_ID() और इतने पर) को पुनर्प्राप्त करने का कोई तरीका है?

+0

'identity' कॉलम अभी भी पृष्ठभूमि में एक दृश्य का उपयोग पुनः प्राप्त करने में मदद मिलेगी। अंतिम उत्पन्न मूल्य प्राप्त करने के लिए आपको सामान्य 'sequence.currval' का उपयोग करने में सक्षम होना चाहिए। –

+0

मुद्दा यह है कि मुझे अनुक्रम का नाम जानना है। Actaully तालिका के नाम और स्कीमा का नाम जानना मुश्किल है जहां मैंने रिकॉर्ड डाला (अनुक्रम का नाम उनसे संबंधित है)। – bubi

+1

आप जिस टेबल को सम्मिलित कर रहे हैं उसका नाम _not_ कैसे पता कर सकते हैं? –

उत्तर

7

ठीक है। ओरेकल 12 सी में पहचान कार्यक्षमता के लिए अनुक्रम और डिफ़ॉल्ट मान का उपयोग करता है। इसलिए आपको अपने प्रश्न के अनुक्रमों के बारे में जानना होगा।

पहले परीक्षण पहचान तालिका बनाएं।

CREATE TABLE IDENTITY_TEST_TABLE 
(
    ID NUMBER GENERATED ALWAYS AS IDENTITY 
, NAME VARCHAR2(30 BYTE) 
); 

सबसे पहले, इस पहचान कॉलम के साथ बनाया गया आपका अनुक्रम नाम ढूंढने दें। यह अनुक्रम नाम आपकी तालिका में एक डिफ़ॉल्ट मान है।

Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS 
where TABLE_NAME = 'IDENTITY_TEST_TABLE'; 

मेरे लिए यह मान "ISEQ _ 193,606 $$"

कुछ मान सम्मिलित है।

INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla'); 
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın'); 

फिर मूल्य डालें और पहचान पाएं।

INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla'); 
SELECT "ISEQ$$_193606".currval from dual; 

आपको अपना पहचान मान देखना चाहिए। यदि आप एक ब्लॉक में करना चाहते हैं

declare 
    s2 number; 
begin 
    INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2; 
    dbms_output.put_line(s2); 
end; 

अंतिम आईडी मेरा पहचान कॉलम नाम है।

+0

यह एकमात्र सही उत्तर है। आपको बस यह सुनिश्चित करने की आवश्यकता है कि आप उसी सत्र में ' .currval' का मूल्यांकन कर रहे हैं। – Ben

0

आपका दायरा, वैश्विक या अंतिम उपयोगकर्ता डाला गया क्या है? वैश्विक हैं, बस

SELECT mytable_seq.nextval MyTableID FROM DUAL 

https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402

का उपयोग करते हैं विशिष्ट Encapsulate अपने आवेषण एक सौदे के भीतर & क्वेरी।

+0

उत्तर के लिए धन्यवाद! दायरा अंतिम उपयोगकर्ता है। मुझे लगता है कि आपका सुझाव केवल MySQL के लिए काम करता है। ओरेकल में काम नहीं करता है (सिंटैक्स त्रुटि) 'दोहरी' खंड को भी जोड़ता है। – bubi

+0

ओह क्षमा करें, मैंने लिंक –

+0

को अपडेट किया है जो वैश्विक के लिए है (मैं वर्तमान का भी उपयोग कर सकता हूं लेकिन अभी भी वैश्विक है) – bubi

1

IDENTITY कॉलम "हुड के नीचे" SEQUENCE का उपयोग करता है - यह उस तालिका के साथ स्वचालित रूप से अनुक्रम बनाकर और छोड़ देता है। इसके अलावा, आप 1000 से शुरू होने और 2 से बढ़ोतरी का उपयोग करके पैरामीटर के साथ प्रारंभ और वृद्धि पैरामीटर निर्दिष्ट कर सकते हैं। जब आप सीधे इसके मानों को संचालित नहीं करना चाहते हैं तो IDENTITY का उपयोग करना बहुत सुविधाजनक है।

लेकिन अगर आपको सीधे अनुक्रम को संचालित करने की आवश्यकता है तो आपको ओरेकल 12 सी - कॉलम डिफ़ॉल्ट मानों में उपलब्ध एक और विकल्प का उपयोग करना चाहिए। सच डिफ़ॉल्ट मान अनुक्रम nextval या currval से उत्पन्न किए जा सकते हैं। आपको एक समझदार अनुक्रम नाम रखने और इसे ट्रिगर के बिना "पहचान" के रूप में उपयोग करने की अनुमति देने के लिए।

create table my_new_table 
(id number default my_new_table_seq.nextval not null) 

आप हमेशा कॉल करने में सक्षम होंगे: my_new_table_seq.currval

RETURNING क्लॉज का उपयोग करके सम्मिलित कथन पर SEQUENCE से उत्पन्न आईडी प्राप्त करना संभव है।

उदाहरण के लिए, एक अस्थायी तालिका बनाने:

create global temporary table local_identity_storage ("id" number) on commit delete rows 

कुछ अस्थायी तालिका में इस मूल्य बचत डालने करें:

CREATE TABLE identity_test_table (
    id_ident   NUMBER GENERATED BY DEFAULT AS IDENTITY, 
    same_value VARCHAR2(100) 
); 

declare 
    v_id number(10, 0); 
begin 
    INSERT INTO identity_test_table 
    (same_value) 
    VALUES 
    ('Test value') 
    RETURNING id_ident INTO v_id; 

    insert into local_identity_storage ("id") values (v_id); 
    commit; 
end; 

अब आप "स्थानीय" डाला आईडी होना।

select "id" from local_identity_storage 
1

ऐसा लगता है कि ओरेकल ने IDENTITY को यह कहने के लिए लागू किया कि वे पहचान का समर्थन करते हैं। सब कुछ अभी भी SEQUENCES का उपयोग करके लागू किया गया है और कभी-कभी आपको कुछ काम करने के लिए SEQUENCE तक पहुंचने की आवश्यकता होती है (यानी नवीनतम डालने वाले IDENTITY को पुनर्प्राप्त करें)।

IDENTITY को MySQL, SQL सर्वर, DB2 के समान पुनर्प्राप्त करने का कोई तरीका नहीं है, और आपको SEQUENCE का उपयोग करके इसे पुनर्प्राप्त करना होगा।

+1

हां, यह SEQUENCE पर अमूर्त है, लेकिन यह INSERT खंड का सिंटैक्स बदल देगा और यह परिवर्तन भी होगा प्रदर्शन में परिलक्षित हो। तीन अलग-अलग तकनीकों का उपयोग करके इस परीक्षण को देखें (ओरेकल 12 सी में डालना) (यहां से परिणाम [https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1]): 1) TRIGGER_IDENTITY : समय = 217 एचएसईसीएस सीपीयू समय = 204 एचएसईसीएस; 2) प्रत्यक्ष उपयोग अनुक्रम: समय = 26 एचएसईसीएस सीपीयू समय = 22 एचसीईसीएस; 3) REAL_IDENTITY: समय = 28 एचएसईसीएस सीपीयू समय = 26 एचसीईसीएस। –

+0

यह ओरेकल डेटाबेस में माइग्रेशन को आसान बनाने के लिए किया गया था। आवेषण पर उन्हें आग लगाने के लिए अनुक्रम और ट्रिगर मैन्युअल रूप से बनाने की आवश्यकता नहीं है - डेटाबेस अब आपके लिए करता है। मैं ओरेकल के लिए बात नहीं करता, लेकिन अगर आप माइग्रेशन में सहायता के लिए 12 सी में हमने और क्या किया है, तो मुझे इस विषय पर एक श्वेतपत्र है। – thatjeffsmith

+0

@thatjeffsmith मैं वास्तव में माइग्रेशन कर रहा हूं लेकिन अन्य डीबीएमएस के समान व्यवहार के बिना काम कठिन है। – bubi

0

की जांच करें

INSERT INTO yourtable (....) 
    VALUES (...) 
    RETURNING pk_id INTO yourtable; 

यह आप पिछले डाला पंक्ति

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