Oracle में GUID कैसे जनरेट करें?


89

क्या एक सम्मिलित कथन में GUID को स्वतः उत्पन्न करना संभव है?

इस GUID को संग्रहीत करने के लिए मुझे किस प्रकार के फ़ील्ड का उपयोग करना चाहिए?

जवाबों:


138

आप अपने सम्मिलित विवरण में GUID उत्पन्न करने के लिए SYS_GUID () फ़ंक्शन का उपयोग कर सकते हैं:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx');

GUIDs के भंडारण के लिए पसंदीदा डेटा रॉ (16) है।

गोपीनाथ जवाब के रूप में:

 select sys_guid() from dual
 union all
 select sys_guid() from dual
 union all 
 select sys_guid() from dual

आपको मिला

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

जैसा कि टोनी एंड्रयूज कहते हैं, केवल एक चरित्र में भिन्न होता है

88FDC68C75D D F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F955E40449808B55601

हो सकता है कि उपयोगी: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html


अजीब, sys_guid () मुझे हमेशा एक ही GUID दे रहा है .. क्या मुझे फ़ंक्शन को बीज देने की आवश्यकता है या?
Acibi

10
क्या आप वाकई वे एक समान हैं? यह बहुत समान (लेकिन अलग) मूल्यों को वापस करने की प्रवृत्ति रखता है - उदाहरण के लिए जब मैंने अभी-अभी कोशिश की तो मुझे 88FDC68C75DEF955E040449808B55601 और 88FDC68C75DFF955E040449808B55601 मिला, जो केवल 12 वें वर्ण में भिन्न है!
टोनी एंड्रयूज

दोहरे से sys_guid () का चयन करें और मूल्यों की तुलना करें। इसके बारे में उत्तर संशोधित करें।
किनिकेत

26

आप उदाहरण के लिए, तालिका के डिफ़ॉल्ट रूप में बनाए गए विवरण में मार्गदर्शिका को भी शामिल कर सकते हैं:

create table t_sysguid
( id     raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/

यहां देखें: http://rwijk.blogspot.com/2009/12/sysguid.html


मुझे एक उपयोगी Oracle सुविधा के बारे में बताने के लिए धन्यवाद, जिसके बारे में मुझे जानकारी नहीं थी।
स्टीव टीटी

7

यह स्पष्ट नहीं है कि आप ऑटो-गाइड को एक सम्मिलित विवरण में क्या उत्पन्न करते हैं, लेकिन एक अनुमान के अनुसार, मुझे लगता है कि आप कुछ ऐसा करने की कोशिश कर रहे हैं:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');

उस स्थिति में मेरा मानना ​​है कि आईडी कॉलम को रॉ (16) घोषित किया जाना चाहिए;

मैं अपने सिर के ऊपर से यह कर रहा हूँ। मेरे पास परीक्षण करने के लिए ओरेकल उदाहरण नहीं है, लेकिन मुझे लगता है कि आप यही चाहते हैं।



4

sys_guid () एक खराब विकल्प है, जैसा कि अन्य उत्तरों ने उल्लेख किया है। UUIDs उत्पन्न करने और अनुक्रमिक मूल्यों से बचने का एक तरीका यह है कि आप अपने आप को यादृच्छिक हेक्स स्ट्रिंग्स उत्पन्न करें:

select regexp_replace(
    to_char(
        DBMS_RANDOM.value(0, power(2, 128)-1),
        'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),
    '([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})',
    '\1-\2-\3-\4-\5') from DUAL;

3
अद्वितीय होने की गारंटी नहीं है। यदि आप इसे संग्रहीत कर रहे हैं, तो आपको इसे एक अद्वितीय बाधा की तरह कुछ के साथ बाँधना होगा। (और यदि आप बार-बार मान का सामना करते हैं और अद्वितीय अवरोध का उल्लंघन करते हैं, तो एक नया नंबर उत्पन्न करता है, हालांकि इसकी संभावना नहीं है)
जेम्स डेली


2

आप अपने UUID को जेनरेट करने के लिए फंक्शन bellow का उपयोग कर सकते हैं

create or replace FUNCTION RANDOM_GUID
    RETURN VARCHAR2 IS

    RNG    NUMBER;
    N      BINARY_INTEGER;
    CCS    VARCHAR2 (128);
    XSTR   VARCHAR2 (4000) := NULL;
  BEGIN
    CCS := '0123456789' || 'ABCDEF';
    RNG := 15;

    FOR I IN 1 .. 32 LOOP
      N := TRUNC (RNG * DBMS_RANDOM.VALUE) + 1;
      XSTR := XSTR || SUBSTR (CCS, N, 1);
    END LOOP;

    RETURN SUBSTR(XSTR, 1, 4) || '-' ||
        SUBSTR(XSTR, 5, 4)        || '-' ||
        SUBSTR(XSTR, 9, 4)        || '-' ||
        SUBSTR(XSTR, 13,4)        || '-' ||
        SUBSTR(XSTR, 17,4)        || '-' ||
        SUBSTR(XSTR, 21,4)        || '-' ||
        SUBSTR(XSTR, 24,4)        || '-' ||
        SUBSTR(XSTR, 28,4);
END RANDOM_GUID;

ऊपर दिए गए फ़ंक्शन के द्वारा खोजा गया GUID का उदाहरण:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04


SYS_GUID हमारी आवश्यकताओं के लिए पर्याप्त यादृच्छिक नहीं था, लेकिन ऐसा लगता है कि GUID को अधिक यादृच्छिक तरीके से पंप करना है।
thePeter

1

यदि आपको गैर-अनुक्रमिक गार्ड की आवश्यकता होती है तो आप sys_guid()एक हैशिंग फ़ंक्शन के माध्यम से परिणाम भेज सकते हैं (देखें https://stackoverflow.com/a/22534843/1462295 )। विचार यह है कि मूल रचना से जो कुछ भी अद्वितीयता का उपयोग किया जाता है, उसे रखने के लिए, और अधिक फेरबदल बिट्स के साथ कुछ प्राप्त करें।

उदाहरण के लिए:

LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32))  

डिफ़ॉल्ट अनुक्रमिक दिशा दिखाने वाला उदाहरण बनाम इसे हैश के माध्यम से भेजना:

SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL  

उत्पादन

80c32a4fbe405707e0531e18980a1bbb
80c32a4fbe415707e0531e18980a1bbb
80c32a4fbe425707e0531e18980a1bbb
80c32a4fbe435707e0531e18980a1bbb
c0f2ff2d3ef7b422c302bd87a4588490
d1886a8f3b4c547c28b0805d70b384f3
a0c565f3008622dde3148cfce9353ba7
1c375f3311faab15dc6a7503ce08182c

0

मैं Oracle के "dbms_crypto.randombytes" फ़ंक्शन का उपयोग करने की सलाह दूंगा।

क्यों? यह फ़ंक्शन बाइट्स के क्रिप्टोग्राफिक रूप से सुरक्षित छद्म यादृच्छिक अनुक्रम वाले RAW मान देता है, जिसका उपयोग एन्क्रिप्शन कुंजी के लिए यादृच्छिक सामग्री उत्पन्न करने के लिए किया जा सकता है।

select REGEXP_REPLACE(dbms_crypto.randombytes(16), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') from dual;

यदि आप केवल एक वर्ण में परिवर्तन करते हैं, तो आप फ़ंक्शन "sys_guid" का उपयोग नहीं करते हैं।

ALTER TABLE locations ADD (uid_col RAW(16));

UPDATE locations SET uid_col = SYS_GUID();

SELECT location_id, uid_col FROM locations
   ORDER BY location_id, uid_col;

LOCATION_ID UID_COL
----------- ----------------------------------------------------------------
       1000 09F686761827CF8AE040578CB20B7491
       1100 09F686761828CF8AE040578CB20B7491
       1200 09F686761829CF8AE040578CB20B7491
       1300 09F68676182ACF8AE040578CB20B7491
       1400 09F68676182BCF8AE040578CB20B7491
       1500 09F68676182CCF8AE040578CB20B7491

https://docs.oracle.com/database/121/SQLRF/functions202.htm#SQLRF06120

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.