কীভাবে কোনও ওরাকল সিকোয়েন্সের বর্তমান মান বৃদ্ধি না করে পুনরুদ্ধার করবেন?


156

এমন কোনও ক্রমের মান পুনরুদ্ধার করার জন্য কি এসকিউএল নির্দেশ রয়েছে যা এটি বৃদ্ধি করে না?

ধন্যবাদ।

সম্পাদনা করুন এবং উপসংহার

জাস্টিন কেভের বক্তব্য অনুসারে সিক্যুয়েন্স নম্বরটি "সংরক্ষণ" করার চেষ্টা করা কার্যকর নয়

select a_seq.nextval from dual;

একটি ক্রম মান পরীক্ষা করতে যথেষ্ট ভাল।

আমি এখনও অলি উত্তরটিকে উত্তম হিসাবে রাখি কারণ এটি প্রাথমিক প্রশ্নের উত্তর দেয়। তবে আপনি যদি কখনও এটি করতে চান তবে ক্রমটি পরিবর্তন না করার প্রয়োজনীয়তা সম্পর্কে নিজেকে জিজ্ঞাসা করুন।


5
কেন? আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা কী? আপনি যদি সিক্যুয়েন্সটি সঠিকভাবে ব্যবহার করছেন, আপনার কখনই অনুক্রম করা উচিত নয় যে অন্যান্য সেশনে কোন সিক্যুয়েন্স মানগুলি অর্পণ করা হয়েছে বা পরবর্তী সেশনে কোন মানগুলি নির্ধারিত হতে পারে।
জাস্টিন গুহ

3
এটি তথ্য হিজরতের পর একটি চেক ডেটা স্থানান্তরিত অনুযায়ী নিশ্চিত ক্রম সঠিকভাবে আপডেট করা হয়েছে হতে এর
frno

3
তারপরে কেবল nextvalপরীক্ষার ক্রমটি লাভ করার পক্ষে নেতিবাচকটি কী ? আপনি ধরে নিচ্ছেন না যে ক্রমগুলি ফাঁক-মুক্ত হবে, তাইনা? সুতরাং একটি ক্রম মান "নষ্ট" একটি সমস্যা হওয়া উচিত নয়।
জাস্টিন গুহ

আমি অনুমান করি আপনি ঠিক বলেছেন, আমি চেকটির জন্য ডিবি-র স্থিতি পরিবর্তন করতে চাইনি তবে সত্য বলতে আমি কেন জানি না। আপনার অন্তর্দৃষ্টি জন্য ধন্যবাদ। তবুও আমি আপনার জিনিসগুলি ক্রম সম্পর্কে শিখলাম, আপনাকে সকলকে ধন্যবাদ!
frno

ধরে নিচ্ছি যে আপনি নির্ভরযোগ্যভাবে একটি সিক্যুয়েন্সের মান পেতে পারেন, আপনি যে ওরাকলটির বিরুদ্ধে যাচাই করছেন যে ক্রমটি সঠিকভাবে আপডেট হয়েছে?
শ্যানন সিভেরেন্স

উত্তর:


173
SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

আপনি এর থেকে ক্রম মেটাডেটা বিভিন্ন পেতে পারেন user_sequences, all_sequencesএবং dba_sequences

এই মতামতগুলি অধিবেশন জুড়ে কাজ করে।

সম্পাদনা করুন:

যদি ক্রমটি আপনার ডিফল্ট স্কিমাতে থাকে তবে:

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

আপনি যদি সমস্ত মেটাডেটা চান তবে:

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

আশা করি এটা সাহায্য করবে...

EDIT2:

যদি আপনার ক্যাশের আকার 1 না হয় তবে এটি আরও নির্ভরযোগ্যভাবে করার একটি দীর্ঘ ঘূর্ণিত উপায় হ'ল:

SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

কেবল সতর্ক হন যে অন্যরা যদি এই সময়ের মধ্যে ক্রম ব্যবহার করে - তবে তারা (বা আপনি) পেতে পারেন

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

এছাড়াও, আপনি NOCACHEপুনরায় সেট করার পূর্বে ক্যাশে সেট করতে চান এবং তারপরে তার মূল মানটিতে ফিরে যেতে চাইলে আপনি অনেকগুলি মানকে ক্যাশে করেননি তা নিশ্চিত করতে পারেন।


কেবল এটি চেষ্টা করে দেখেছি তবে আমার 'সমস্ত_সামগ্রী' সারণীতে অ্যাক্সেস নেই। আপনি কি কেবল অ্যাডমিন শংসাপত্রের সাথে দেখতে এটি কোনও বিশেষ বিষয়?
frno

1
ALL_SEQUENCESএকটি দৃষ্টিভঙ্গি। যদি আপনার এটিতে অ্যাক্সেস না USER_SEQUENCESথাকে তবে সিকোয়েন্সটি আপনার ডিফল্ট স্কিমাতে রয়েছে কিনা তা থেকে নির্বাচন করার চেষ্টা করুন । (আপনার sequence_owner = '<sequence_owner>'জন্য এই ধারাটির প্রয়োজন হবে না USER_SEQUENCES)।
অলি

15
LAST_NUMBERমধ্যে ALL_SEQUENCESশেষ নম্বর হবে না একটি সেশন আসলে দেওয়া হয়েছিল এবং সংখ্যা একটি কল থেকে ফেরত পাঠানো হবে হবে না sequence_name.nextvalসাধারণভাবে। ধরুন আপনি CACHE1 টিরও বেশি সিক্যুয়েন্স সেট করেছেন (ডিফল্ট 20), LAST_NUMBERক্যাশে থাকা শেষ সংখ্যাটি হবে be এই সংখ্যাটি আসলে কোনও সেশনে দেওয়া হবে এমন কোনও গ্যারান্টি নেই।
জাস্টিন গুহ 13

2
ALTER SEQUENCE seq INCREMENT BY -1;সমস্যা হতে চলেছে যদি না কেউ গ্যারান্টি দিতে পারে যে অন্য কোনও অধিবেশন ডাকবে না seq.nextval। অন্যথায় ক্রমটি সদৃশ মানগুলি প্রদান করবে যা সাধারণত যা চায় তা নয়।
শ্যানন সিভেরেন্স

1
ওপিতে "এটি ডেটা মাইগ্রেশনের পরে একটি চেক" বলেছে তাই ডিবি সাধারণভাবে ব্যবহারযোগ্য নয় এটি ধরে নেওয়া কোনও চাপ নয় তবে এটি যদি সমস্যা না ঘটে তবে এটি একটি সমস্যা হতে পারে।
অলি

122

select MY_SEQ_NAME.currval from DUAL;

মনে রাখবেন যে এটি যদি কেবলমাত্র select MY_SEQ_NAME.nextval from DUAL;বর্তমান সেশনে দৌড়ে যায় তবেই এটি কাজ করে ।


1
আপনার উত্তরের জন্য একটি গুচ্ছ ধন্যবাদ। আমি Boomi ভিতরে এই ব্যবহার করতে হবে এবং একটি সমাধান আপ করুন এবং নিচে খুঁজছেন ছিল
লার্নিং ...

0

আমার আসল উত্তরটি সত্যই ভুল ছিল এবং আমি খুশি যে এটি সরানো হয়েছে। নীচের কোডটি নিম্নলিখিত শর্তের অধীনে কাজ করবে) ক) আপনি জানেন যে অন্য কেউ সিকোয়েন্সটি সংশোধন করেনি খ) সিকোয়েন্সটি আপনার সেশনের মাধ্যমে সংশোধিত হয়েছিল। আমার ক্ষেত্রে, আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি যেখানে আমি একটি প্রক্রিয়া কল করেছিলাম যা একটি মান সংশোধন করে এবং আমি বিশ্বাস করি যে অনুমানটি সত্য is

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

দুঃখের বিষয়, আপনি যদি নিজের সেশনে ক্রমটি পরিবর্তন না করেন তবে আমি বিশ্বাস করি যে নেক্সটওয়ালই একমাত্র উপায়।


0

এটি কোনও উত্তর নয়, সত্যই এবং আমি প্রশ্নটি লক না করা থাকলে একটি মন্তব্য হিসাবে এটি প্রবেশ করতাম। এটি প্রশ্নের উত্তর দেয়:

কেন আপনি এটি চান?

ধরুন আপনার কাছে প্রাথমিক কী হিসাবে ক্রম সহ একটি টেবিল রয়েছে এবং সিকোয়েন্সটি একটি সন্নিবেশ ট্রিগার দ্বারা উত্পন্ন হয়েছে। আপনি যদি রেকর্ডটিতে পরবর্তী আপডেটগুলির জন্য ক্রমটি উপলব্ধ রাখতে চান তবে আপনার সেই মানটি বের করার একটি উপায় থাকা দরকার।

আপনি সঠিকটি পেয়েছেন তা নিশ্চিত করার জন্য, আপনি কোনও লেনদেনের মধ্যে INSERT এবং রনকের কোয়েরিটি মোড়তে চাইতে পারেন।

রনকের প্রশ্ন:

select MY_SEQ_NAME.currval from DUAL;

উপরের দৃশ্যে, সন্নিবেশ এবং আপডেট একই অধিবেশন হওয়ার পরে রনকের ক্যাভিয়েট প্রযোজ্য নয়।


0

আমি CURRVAL ব্যবহার করার চেষ্টাও করেছি, আমার ক্ষেত্রে কিছু প্রক্রিয়া প্রাথমিক কী হিসাবে সেই সিকোয়েন্স সহ কিছু টেবিলে নতুন সারি প্রবেশ করানো হয়েছে কিনা তা খুঁজে বের করার জন্য। আমার ধারনা ছিল যে কার্ভাল দ্রুততম পদ্ধতি হবে। তবে ক) কার্লভাল কাজ করে না, এটি কেবল পুরানো মানটি পাবে কারণ আপনি অন্য ওরাকল সেশনে রয়েছেন, যতক্ষণ না আপনি নিজের সেশনে একটি নেক্সটওয়াল না করেন। এবং খ) ক select max(PK) from TheTableখুব দ্রুত, সম্ভবত কোনও পিকে সর্বদা সূচকযুক্ত। বা select count(*) from TheTable। আমি এখনও পরীক্ষা নিরীক্ষা করছি, তবে উভয়ই নির্বাচনকে দ্রুত বলে মনে হচ্ছে।

আমি সিকোয়েন্সের কোনও ব্যবধান মনে করি না, তবে আমার ক্ষেত্রে আমি প্রচুর ভোট দেওয়ার কথা ভাবছিলাম এবং আমি খুব বড় ব্যবধানের ধারণাটিকে ঘৃণা করব। বিশেষত যদি একটি সাধারণ নির্বাচন ঠিক তত দ্রুত হয়।

উপসংহার:

  • কার্ভাল বেশ অযোগ্য
  • আপনার সিকোয়েন্সটি সেই টেবিলের সাথে সংযুক্ত রয়েছে বলে ধরে নিলেন ম্যাক্স (...) থেকে নির্বাচন করুন ... একটি সহজ সমাধান, সহজ এবং দ্রুত is
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.