অরেকালে অস্থায়ী টেবিল বা টেবিল ভেরিয়েবলগুলি ব্যবহার করে কীভাবে এসকিউএল সার্ভার সঞ্চিত পদ্ধতিগুলি স্থানান্তরিত করবেন?


9

সি # বিকাশকারী এসকিউএল সার্ভার রক্ষার জন্য ম্যানেজমেন্ট দ্বারা উত্সাহিত সঞ্চিত পদ্ধতি প্রায়শই এই জাতীয় পদ্ধতি উত্পাদন করে

create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;

একক বিবৃতি বরং সহজ এবং এই পদ্ধতি তাদের সঠিক ফলাফল উত্পাদন করে তোলে।

প্রায়শই আমার কাজ হ'ল ওরাকলে এই জাতীয় প্রক্রিয়া স্থানান্তর করা।

আসুন নিম্নলিখিত বিষয়গুলির মুখোমুখি হন।

  • এসকিউএল সার্ভারে বিভিন্ন অস্থায়ী সারণী সম্পূর্ণরূপে স্বতন্ত্র এবং কোনও অ্যাডহক কাঠামো থাকতে পারে।
  • ওরাকল গ্লোবাল কমন টেবিলগুলি হ'ল গ্লোবাল অবজেক্ট এবং সমস্ত ব্যবহার একই সারণির কাঠামোকে ভাগ করে দেয়। এই কাঠামোটি সংশোধন করা অসম্ভব, যদিও এটি যে কোনও জায়গায় ব্যবহৃত হয়।

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

ইউনিয়নগুলি দ্বারা পৃথক সন্নিবেশগুলি প্রতিস্থাপন করুন

সর্বাধিক সাধারণ ক্ষেত্রে উপরেরটি এমন কিছুতে রূপান্তরিত হতে পারে

select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;

ফাংশন ব্যবহার

উভয় স্কেলারের ফাংশন এবং টেবিলের মূল্যবান ফাংশন আপনার পদ্ধতিটিকে উপরের ফর্মের একক ক্যোয়ারিতে রূপান্তর করতে সহায়তা করতে পারে।

সাধারণ সারণী এক্সপ্রেশন ওরফে সাবকিউরি ফ্যাক্টরিং

অস্থায়ী সারণীগুলি এড়াতে সাবাকারি ফ্যাক্টরিং প্রায় সেরা ওরাকলকে দেওয়া। এটি ব্যবহার করে এসকিউএল সার্ভারকে ওরাকলে স্থানান্তরিত করা আবার বরং সহজ। এটির জন্য এসকিউএল সার্ভার 2005 এবং তারপরের প্রয়োজন।


এই পরিবর্তনগুলি এসকিউএল সার্ভার সংস্করণে উন্নতি করে এবং অনেক ক্ষেত্রে মাইগ্রেশনটিকে সরাসরি এগিয়ে নিয়ে যায়। অন্যান্য ক্ষেত্রে গ্লোবাল অস্থায়ী টেবিলগুলির অবলম্বন একটি সীমাবদ্ধ সময়ে মাইগ্রেশন করা সম্ভব করে তোলে তবে এটি সন্তুষ্টিজনক নয়।


ওরাকলে বৈশ্বিক অস্থায়ী টেবিলের ব্যবহার এড়াতে আরও কী উপায় আছে?


3
আমি বলব যে এর মতো কোডটি প্রক্রিয়াগত না ভিত্তিক চিন্তাধারার সূচক। এবং এগুলি একক # সহ স্থানীয় টেম্প টেবিল। আমি পরিচালনা করছি এবং আমি যদি পায়ে ভেঙে দেখি যে প্রযোজনায় যাচ্ছে :-)
জিবিএন

আমি সম্পূর্ণ সম্মত
bernd_k

@gbn - আইডিয়োম্যাটিক টিএল - এসকিউএল এর চেয়ে আইডিয়োম্যাটিক পিএল / এসকিউএল কিছুটা বেশি পদ্ধতিগত হতে থাকে। টেম্প টেবিলগুলি টি-এসকিউএলে সেট আপগুলিতে প্রায় সবকিছু করা সম্ভব করে তোলে make পিএল / এসকিউএল এর সমান্তরাল কার্সার অপস এবং পদ্ধতিগত কোডটি অনুকূলকরণের জন্য আরও অনেকগুলি কার্যকারিতা রয়েছে।
কনসার্নড

উত্তর:


3

এটি করার একটি উপায় হ'ল অবজেক্ট টাইপস , এক্ষেত্রে টাইপটি আপনার পক্ষে অ্যানালগাস হতে পারে #t1। সুতরাং এটি কোথাও সংজ্ঞায়িত করা দরকার তবে এটি বিশ্বব্যাপী হওয়ার দরকার নেই, এটি প্রতি-স্কিমা বা প্রতি-প্রক্রিয়া এমনকি হতে পারে। প্রথমত, আমরা একটি প্রকার তৈরি করতে পারি:

SQL> create or replace type t1_type as object (x int, y int, z int)
  2  /

Type created.

SQL> create or replace type t1 as table of t1_type
  2  /

Type created.

এখন কিছু নমুনা ডেটা সেট আপ করুন:

SQL> create table xy (x int, y int)
  2  /

Table created.

SQL> insert into xy values (1, 2)
  2  /

1 row created.

SQL> insert into xy values (3, 4)
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

এবং এই "ডেটা" অস্থায়ী "প্রকারটি ফিরিয়ে নেওয়ার জন্য একটি ফাংশন তৈরি করুন:

SQL> create or replace function fn_t1 return t1 as
  2  v_t1 t1 := t1();       -- empty temporary table (really an array)
  3  v_ix number default 0; -- array index
  4  begin
  5  for r in (select * from xy) loop
  6  v_ix := v_ix + 1;
  7  v_t1.extend;
  8  v_t1(v_ix) := t1_type(r.x, r.y, (r.x + r.y));
  9  end loop;
 10  return v_t1;
 11  end;
 12  /

Function created.

এবং পরিশেষে:

SQL> select * from the (select cast (fn_t1 as t1) from dual)
  2  /

         X          Y          Z
---------- ---------- ----------
         1          2          3
         3          4          7

যেহেতু আপনি দেখতে পাচ্ছেন এটি বেশ ছদ্মবেশী (এবং সংগ্রহ সিউডো-ফাংশনগুলি ব্যবহার করে যা সবচেয়ে ভাল সময়ে অস্পষ্ট বৈশিষ্ট্য!) যেমনটি আমি সবসময় বলে থাকি, ডিবি থেকে ডিবিতে পোর্ট করা কেবল তাদের এসকিউএল উপভাষায় বাক্য গঠন এবং কীওয়ার্ড সম্পর্কে নয় is , আসল অসুবিধাটি বিভিন্ন অন্তর্নিহিত অনুমানগুলিতে আসে (এসকিউএল সার্ভারের ক্ষেত্রে, যে কার্সারগুলি ব্যয়বহুল এবং তাদের ব্যবহার এড়াতে / সর্বদা ব্যয় করে কাজ করে)।


3

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

--Setup
CREATE TABLE table_a (c1 Number(2));
CREATE TABLE table_b (c1 Number(2));
INSERT INTO table_a (SELECT rownum FROM dual CONNECT BY rownum<=4);
INSERT INTO table_b (SELECT rownum+5 FROM dual CONNECT BY rownum<=4);

--Example
DECLARE
   Type tNumberArray Is Table Of Number;
   v1 tNumberArray;
BEGIN
   SELECT c1 BULK COLLECT INTO v1 FROM (
      SELECT c1 FROM table_a
      UNION ALL
      SELECT c1 FROM table_b
      );

   For x IN v1.First..v1.Last Loop
      /* Complex manipulation goes here. */
      If (v1(x) <= 3) Then
         v1(x) := v1(x)*10;
      End If;
      DBMS_OUTPUT.PUT_LINE(v1(x));
   End Loop;
END;
/

+1, তবে এটি ফলাফলের সেটটি ফিরে আসবে না (যদি SELECTকোনও টি-এসকিউএল সংরক্ষিত প্রকোপের শেষ জিনিস হয় তবে এটিই ফিরে আসে)
গাইস

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