क्या एक सम्मिलित कथन में GUID को स्वतः उत्पन्न करना संभव है?
इस GUID को संग्रहीत करने के लिए मुझे किस प्रकार के फ़ील्ड का उपयोग करना चाहिए?
जवाबों:
आप अपने सम्मिलित विवरण में 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
आप उदाहरण के लिए, तालिका के डिफ़ॉल्ट रूप में बनाए गए विवरण में मार्गदर्शिका को भी शामिल कर सकते हैं:
create table t_sysguid
( id raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/
यहां देखें: http://rwijk.blogspot.com/2009/12/sysguid.html
यह स्पष्ट नहीं है कि आप ऑटो-गाइड को एक सम्मिलित विवरण में क्या उत्पन्न करते हैं, लेकिन एक अनुमान के अनुसार, मुझे लगता है कि आप कुछ ऐसा करने की कोशिश कर रहे हैं:
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');
उस स्थिति में मेरा मानना है कि आईडी कॉलम को रॉ (16) घोषित किया जाना चाहिए;
मैं अपने सिर के ऊपर से यह कर रहा हूँ। मेरे पास परीक्षण करने के लिए ओरेकल उदाहरण नहीं है, लेकिन मुझे लगता है कि आप यही चाहते हैं।
उदाहरण पाया: http://www.orafaq.com/usenet/comp.dat डेटाबेस.oracle.server/2006/12/20/0646 .htm
SELECT REGEXP_REPLACE(SYS_GUID(), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') MSSQL_GUID FROM DUAL
परिणाम:
6C7C9A50-3514-4E77-E053-B30210AC1082
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;
आप निम्न क्वेरी चला सकते हैं
select sys_guid() from dual
union all
select sys_guid() from dual
union all
select sys_guid() from dual
आप अपने 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()
एक हैशिंग फ़ंक्शन के माध्यम से परिणाम भेज सकते हैं (देखें 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
मैं Oracle के "dbms_crypto.randombytes" फ़ंक्शन का उपयोग करने की सलाह दूंगा।
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