নিয়মিত লুপের পরিবর্তে সুস্পষ্ট কার্সার কেন ব্যবহার করবেন?


12

আমি এক বছরের জন্য বেসিক ওয়েব অ্যাপ্লিকেশন লিখছি (একটি ওরাকল ডিবির জন্য), এবং যেহেতু ফাংশনগুলি বেশ সহজ, আমাদের বেশিরভাগই আমাদের ডেটা পেতে নিয়মিত ফর লুপের সাথে আঁকড়ে থাকি:

for i in (select * from STUDENTS) loop
      htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;

তবে, কার্সারগুলি জিনিসগুলির 'সঠিক' উপায় বলে মনে হচ্ছে। আমি কার্সারগুলি কী এবং তার মাধ্যমে লুপ করার বিভিন্ন উপায় সম্পর্কে প্রচুর তথ্য খুঁজে পেতে পারি, তবে নিয়মিত লুপগুলির জন্য কেন সেগুলি ব্যবহার করার কোনও ठोस কারণ আমি খুঁজে পাচ্ছি না। এটি পদ্ধতির প্রয়োজনের উপর নির্ভরশীল? আমার কি সচেতন হওয়া অন্তর্নিহিত সুবিধা আছে?


এই ধরণের FORকার্সর ব্যবহারের অন্য উপায় way দস্তাবেজগুলি দেখুন: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… যাইহোক, htp.prn () কী করে?
dezso

এটি আমাদের আউটপুট ফাংশনগুলির একটি। সুতরাং, কোন পদ্ধতিটি ব্যবহার করবেন সে সম্পর্কে আপনার কি অগ্রাধিকার আছে?
ini

এই ধরণের জিনিসগুলির জন্য FORলুপটি আরও বেশি পাঠযোগ্য, আমার ধারণা think আমি কেবল 'সামনের' দিকে না গিয়ে পেছনের দিকে যেতে হয় তবে আমি 'রিয়েল' কার্সার ব্যবহার করি। আমি অন্যান্য প্রশ্নটি জিজ্ঞাসা করেছি কারণ আমি এর পরিবর্তে কোনও টেবিলের কার্যকারিতা কল্পনা করতে পারি htp.prn()
dezso

এটি উল্লেখ করার মতো যে উভয় ধরণের কার্সারেরই একটি খাঁটি এসকিউএল সমাধানের নিকৃষ্ট কর্মক্ষমতা থাকে - বিশেষ করে ডিএমএলের বিবৃতিগুলির সাথে প্রাসঙ্গিক।
ডেভিড অলড্রিজ

উত্তর:


7

একটি কার্সার স্পষ্ট বা অন্তর্নিহিত হতে পারে, এবং উভয় প্রকারের জন্য একটি লুপ ব্যবহার করা যেতে পারে। আপনার প্রশ্নের আসলে দুটি দিক রয়েছে।

  1. লুপের জন্য একটি অন্তর্নিহিত কার্সারের উপরে লুপের জন্য একটি সুস্পষ্ট কার্সার কেন ব্যবহার করবেন?

    • লুপের জন্য একটি সুস্পষ্ট কার্সার ব্যবহার করুন যখন কোয়েরিটি পুনরায় ব্যবহৃত হবে, অন্যথায় একটি অন্তর্নিহিত কার্সার পছন্দ করা হবে।
  2. স্পষ্টভাবে FETCH নেই এমন একটি লুপের পরিবর্তে FETCH দিয়ে একটি লুপ কেন ব্যবহার করবেন?

    • যখন আপনাকে প্রচুর পরিমাণে সংগ্রহ করতে হবে বা যখন আপনার ডায়নামিক এসকিউএল প্রয়োজন হবে তখন একটি লুপের মধ্যে একটি FETCH ব্যবহার করুন।

এখানে ডকুমেন্টেশন থেকে কিছু দরকারী তথ্য দেওয়া হয়েছে।

লুপের জন্য অন্তর্ভুক্ত কার্সারের উদাহরণ

BEGIN
   FOR vItems IN (
      SELECT last_name
      FROM employees
      WHERE manager_id > 120
      ORDER BY last_name
   ) 
   LOOP
      DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
   END LOOP;
END;
/

লুপের জন্য সুস্পষ্ট কার্সারের উদাহরণ

DECLARE
   CURSOR c1 IS
      SELECT last_name
      FROM employees
      WHERE manager_id > 120
      ORDER BY last_name;
BEGIN
   FOR vItems IN c1 LOOP
      DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
   END LOOP;
END;
/

অন্তর্নিহিত কার্সার

একটি অন্তর্নিহিত কার্সার হ'ল একটি সেশন কার্সার যা পিএল / এসকিউএল দ্বারা নির্মিত এবং পরিচালিত হয়। পিএল / এসকিউএল প্রতিবার আপনি নির্বাচন বা ডিএমএল বিবৃতি চালানোর সময় একটি অন্তর্নিহিত কার্সার খোলে। আপনি একটি অন্তর্নিহিত কার্সার নিয়ন্ত্রণ করতে পারবেন না, তবে আপনি এর বৈশিষ্ট্যগুলি থেকে তথ্য পেতে পারেন।

এর সাথে সম্পর্কিত বিবৃতি চলার পরে একটি অন্তর্নিহিত কার্সার বন্ধ হয়; তবে, অন্য বৈশিষ্ট্য বা ডিএমএল বিবৃতি চালিত না হওয়া পর্যন্ত এর বৈশিষ্ট্য মানগুলি উপলব্ধ থাকে।

অন্তর্নিহিত কার্সার বৈশিষ্ট্যগুলি হ'ল: এসকিউএল% ইসোপেন, এসকিউএল% ফাউন্ড, এসকিউএল% নোটফাউন্ড, এসকিউএল% রাউকাউন্ট, এসকিউএল% বালক_আরউব্যাক্টস, এসকিউএল% বুলক_এক্সসিপিশনস

সুস্পষ্ট কার্সার

একটি সুস্পষ্ট কার্সার হ'ল একটি সেশন কার্সার যা আপনি তৈরি এবং পরিচালনা করেন। আপনাকে অবশ্যই একটি স্পষ্ট কার্সার ঘোষণা করতে হবে এবং এটি সংজ্ঞায়িত করতে হবে, একটি নাম দেবে এবং এটিকে একটি ক্যোয়ারির সাথে যুক্ত করে (সাধারণত, ক্যোয়ারিতে একাধিক সারি ফেরত দেয়)। তারপরে আপনি কোয়েরির ফলাফলটিকে এই যে কোনও একটিতে সেট করে প্রক্রিয়া করতে পারেন:

সুস্পষ্ট কার্সারটি খুলুন (ওপেন বিবৃতি সহ), ফলাফল সেট থেকে সারিগুলি আনুন (FETCH বিবৃতি সহ), এবং সুস্পষ্ট কার্সারটি বন্ধ করুন (ক্লোজ স্টেটমেন্ট সহ)।

লুপ বিবৃতিটির জন্য একটি কার্সারে সুস্পষ্ট কার্সারটি ব্যবহার করুন ("লুপ বিবৃতিগুলির জন্য কার্সার সহ কোয়েরি ফলাফল সেট প্রক্রিয়াজাতকরণ দেখুন")।

আপনি একটি সুস্পষ্ট কার্সারে একটি মান নির্ধারণ করতে পারবেন না, এটি একটি অভিব্যক্তিতে ব্যবহার করতে পারবেন না বা এটি একটি আনুষ্ঠানিক সাবপ্রগ্রাম পরামিতি বা হোস্ট ভেরিয়েবল হিসাবে ব্যবহার করতে পারবেন। আপনি কার্সার ভেরিয়েবলের সাহায্যে এই জিনিসগুলি করতে পারেন ("কার্সার ভেরিয়েবলগুলি দেখুন")।

একটি অন্তর্নিহিত কার্সারের থেকে পৃথক, আপনি একটি সুস্পষ্ট কার্সার বা কার্সার ভেরিয়েবল এর নাম দ্বারা উল্লেখ করতে পারেন। সুতরাং, একটি সুস্পষ্ট কার্সার বা কার্সার ভেরিয়েবলকে নামযুক্ত কার্সার বলা হয়।

লুপ বিবৃতি জন্য কার্সার

লুপ স্টেটমেন্টের জন্য কার্সার আপনাকে একটি নির্বাচন স্টেটমেন্ট চালাতে দেয় এবং তারপরে অবিলম্বে ফলাফল সেটটির সারিগুলির মধ্য দিয়ে লুপ হয়। এই বিবৃতিটি একটি অন্তর্নিহিত বা সুস্পষ্ট কার্সার ব্যবহার করতে পারে।


1
অন্তর্নিহিত কার্সারগুলি 10 গ্রাম থেকে একসময় 100 টি সারি নিয়ে আসে।
ডেভিড অলড্রিজ

16

আপনার পোস্ট করা কোডটি একটি কার্সার ব্যবহার করছে। এটি একটি অন্তর্নিহিত কার্সার লুপ ব্যবহার করছে।

এমন কেস রয়েছে যেখানে স্পষ্টত কার্সার লুপ ব্যবহার করা (অর্থাত্ ঘোষণার বিভাগে একটি CURSOR ভেরিয়েবল ঘোষণা করা) ক্লিনার কোড বা আরও ভাল পারফরম্যান্স তৈরি করে

  1. আপনার যদি আরও জটিল প্রশ্ন থাকে যা আপনি দৃশ্যের মাধ্যমে পুনঃসংশ্লিষ্ট করতে পারেন না তবে আপনার লুপটি পুনরায় ঘন হলে এটি পড়তে কোডটিকে আরও সহজ করে তুলবে student_cursor30 লাইন এসকিউএল বিবৃতি অন্তর্ভুক্ত না করে যুক্তিগুলির একগুচ্ছ এম্বেড করে। উদাহরণস্বরূপ, আপনি যদি স্নাতক স্নাতক সাফ হওয়া সমস্ত শিক্ষার্থী এবং তাদের একাডেমিক রেকর্ডযুক্ত টেবিলে যোগদানের সাথে জড়িত, তাদের ডিগ্রি প্রোগ্রামের প্রয়োজনীয়তা, একাডেমিক হোল্ড সম্পর্কিত তথ্যের সারণী, অতিরিক্ত গ্রন্থাগারের বই সম্পর্কিত তথ্য সহ সারণী, বিনা বেতনের ফি, প্রশাসনিক ওভাররাইড ইত্যাদির তথ্য সহ সারণীগুলি কোডটির পুনঃঅ্যাক্টর করা সম্ভবত বোধগম্য হবে যাতে কোনও ব্যবহারকারীকে তালিকা উপস্থাপনের সাথে সম্পর্কিত এই কোয়েরিটি কোডের মাঝখানে আটকে না যায়। এর মধ্যে এমন একটি ভিউ তৈরি করা জড়িত হতে পারে যা এই সমস্ত যুক্তি সজ্জিত করে। অথবা এটি কোনও স্পষ্টত কার্সার তৈরির সাথে জড়িত থাকতে পারে যা বর্তমান পিএল / এসকিউএল ব্লকের অংশ হিসাবে ঘোষণা করা হয়েছিল বা কোনও উচ্চ-স্তরের পিএল / এসকিউএল ব্লকে (যেমন) একটি প্যাকেজে ঘোষিত একটি কার্সার) যাতে এটি পুনরায় ব্যবহারযোগ্য। অথবা এটি এনক্যাপসুলেশন এবং পুনঃব্যবহারযোগ্যতার জন্য অন্য কিছু করার সাথে জড়িত থাকতে পারে (বলুন, পরিবর্তে পাইপলাইনযুক্ত টেবিল ফাংশন তৈরি করুন)।
  2. আপনি যদি পিএল / এসকিউএল এ বাল্ক অপারেশন ব্যবহার করতে চান তবে আপনি সাধারণত স্পষ্টত কার্সার ব্যবহার করতে চান। এখানে একটি স্ট্যাকওভারফ্লো থ্রেড রয়েছে যা সুস্পষ্ট এবং অন্তর্নিহিত কার্সারের মধ্যে পারফরম্যান্স পার্থক্য নিয়ে আলোচনা করে । যদি সব করছ কল করছে htp.prn, একটি করছেন BULK COLLECTসম্ভবত আপনি কিছু কিনতে হয় না। অন্যান্য ক্ষেত্রে, যদিও এটির কার্যকরী উন্নতি হতে পারে।

2

আমি দেখতে পাচ্ছি যে অনেক বিকাশকারী পুরাতন অভ্যাসের বাইরে অন্তর্নিহিত কার্সারের পরিবর্তে সুস্পষ্ট কার্সার ব্যবহার করছে। এটি কারণ ওরাকল সংস্করণ back এ ফিরে আসা সর্বদা আরও কার্যকর উপায় ছিল। আজকাল সাধারণত অন্যান্য উপায় আছে। বিশেষত অপ্টিমাইজারের সাহায্যে যে প্রয়োজন হলে লুপের জন্য অন্তর্নিহিত কার্সারটি একটি বৃহত সংগ্রহে পুনরায় লিখতে পারে।


0

সাম্প্রতিক আমাকে একটি স্পষ্ট ফর্ম লুপ থেকে স্পষ্টত কার্সারে পুনরায় লিখতে হয়েছিল। কারণটি ছিল যে অনুসন্ধানগুলি লিংকের মাধ্যমে একটি বাহ্যিক ডাটাবেস থেকে ডেটা এনেছে এবং এই ডাটাবেসটি আমাদের স্থানীয় ডাটাবেসের চেয়ে আলাদা এনকোডিং করেছে। স্থানীয়ভাবে সংজ্ঞায়িত রেকর্ড টাইপের মিস্টারিয়াস আন্তঃসন্তান ত্রুটিগুলি অন্তর্ভুক্ত কার্সার থেকে ডেটা স্থানান্তর করার সময় (কেবলমাত্র নির্দিষ্ট নির্দিষ্ট সারিগুলিতে)। আমাদের ডিবিএ আমাদের এটি ব্যাখ্যা করেছিল, আমরা নিজেরাই এর তলায় যেতে পারতাম না। দেখে মনে হচ্ছে এটি ওরাকলে একটি বাগ যা জানা গেছে।

সুস্পষ্ট কার্সার ব্যবহার করে আমাদের সবকিছু পুনর্লিখনের পরামর্শ দেওয়া হয়েছিল এবং ত্রুটিটি চলে গেছে।

আপনি অন্তর্নিহিত উপর সুস্পষ্ট ব্যবহার করতে পারেন প্রাথমিক কারণ নয়, কিন্তু একটি নোট মূল্য।

সম্পাদনা: ওরাকল 12 সি।


আপনি কি বাগ এবং / অথবা নোট নম্বর যুক্ত করতে পারেন তাই যারা এটি পড়ছেন তারা লক্ষণগুলি সম্পর্কে আরও জানতে পারবেন এবং / কখন এটি সমাধান করা হয়?
লেইফ রিফেল

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