ওরাকল পিএল / এসকিউএল - কীভাবে একটি সাধারণ অ্যারে ভেরিয়েবল তৈরি করবেন?


128

আমি একটি ইন-মেমরি অ্যারে ভেরিয়েবল তৈরি করতে চাই যা আমার পিএল / এসকিউএল কোডে ব্যবহার করা যেতে পারে। খাঁটি মেমরি ব্যবহার করে ওরাকল পিএল / এসকিউএল-তে আমি কোনও সংগ্রহ খুঁজে পাই না, এগুলি সমস্ত টেবিলের সাথে যুক্ত বলে মনে হচ্ছে। আমি আমার পিএল / এসকিউএল (সি # সিনট্যাক্স) এ এরকম কিছু করতে চাইছি:

string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};

সম্পাদনা: ওরাকল: 9i



1
"সারণী" রেফারেন্সটি পুরানো পিএল / এসকিউএল টেবিলগুলির নামকরণ থেকে একটি হ্যাংওভার হতে থাকে। VARRAYs, সহযোগী অ্যারে এবং ঘোষিত নেস্টেড টেবিলগুলি সমস্ত ইন-মেমরি অ্যারে টাইপ।
অলি

উত্তর:


244

আপনি একটি স্থির আকারের অ্যারের জন্য VARRAY ব্যবহার করতে পারেন:

declare
   type array_t is varray(3) of varchar2(10);
   array array_t := array_t('Matt', 'Joanne', 'Robert');
begin
   for i in 1..array.count loop
       dbms_output.put_line(array(i));
   end loop;
end;

বা আনবাউন্ডেড অ্যারের জন্য টেবিল:

...
   type array_t is table of varchar2(10);
...

বিভ্রান্তিকরভাবে এখানে "টেবিল" শব্দটির ডেটাবেস টেবিলগুলির সাথে কোনও সম্পর্ক নেই। দুটি পদ্ধতিই মেমরির অ্যারে তৈরি করে।

এর যে কোনও একটি দিয়ে আপনার উপাদান দুটি যুক্ত করার আগে সংগ্রহ এবং প্রসারিত উভয়ই প্রয়োজন:

declare
   type array_t is varray(3) of varchar2(10);
   array array_t := array_t(); -- Initialise it
begin
   for i in 1..3 loop
      array.extend(); -- Extend it
      array(i) := 'x';
   end loop;
end;

প্রথম সূচকটি 1 নয় 0।


75
"বিভ্রান্তিমূলকভাবে" ঠিক ওরাকল
এম.এডমন্ডসন

আমি কি অ্যারেগুলির মতো টেবিলগুলিতে সন্নিবেশ করবো? অর্থাতmy_array(0) := 'some string';
আব্দুল

@ টনিঅ্যান্ড্রুজ array.extend();কি নিয়মিত বাউন্ডেড অ্যারেতে স্লট যুক্ত করে? সেক্ষেত্রে এটি আকারে ইতিমধ্যে গতিশীল যাতে কোনও টেবিলের (আনবাউন্ডেড অ্যারে) প্রয়োজন হয় না।
আব্দুল

2
@ আবদুল, না তা হয় না। আমি সাধারণত VARRAY ব্যবহার করি না তবে উপরের কোডটি পরীক্ষা করার সময় আমি পরীক্ষা করেছিলাম যে আপনি যদি varray(3)4 বার প্রসারিত করার চেষ্টা করেন তবে কী ঘটে - আপনি একটি "সীমা ছাড়িয়ে সাবস্ক্রিপ্ট" ত্রুটি পান।
টনি অ্যান্ড্রুজ

2
আপনি এই উত্তরটি একাধিকবার @ টনিঅ্যান্ড্রুজকে আবদ্ধ করার জন্য আশাবাদী array.extend()। যেখানেই আমি তাকিয়েছি সেখানে এটি প্রদর্শিত হয়নি এবং একাধিক আইটেম যুক্ত করার পক্ষে এটি সর্বাধিক গুরুত্বপূর্ণ অংশ ছিল (এটি আমার বোঝার থেকে, এসকিউএল এ অ্যারেতে এখনও নতুন)।
জোনাথন ভ্যান ড্যাম

61

আপনি কেবল একটি বিনারওয়াইপিটিগ্রার দ্বারা সূচিযুক্ত ইন-মেমরি ভেরিয়েবল দৈর্ঘ্যের অ্যারে ধরে রাখতে একটি ডিবিএমএসএসকিউএল.উবারচার 2_TABLE ঘোষণা করতে পারেন:

DECLARE
   name_array dbms_sql.varchar2_table;
BEGIN
   name_array(1) := 'Tim';
   name_array(2) := 'Daisy';
   name_array(3) := 'Mike';
   name_array(4) := 'Marsha';
   --
   FOR i IN name_array.FIRST .. name_array.LAST
   LOOP
      -- Do something
   END LOOP;
END;

তারা কোনও মেমরির অ্যারে হওয়ায় আপনি কোনও এসোসিয়েটিভ অ্যারে (পিএল / এসকিউএল টেবিল হিসাবে পরিচিত) ব্যবহার করতে পারেন।

DECLARE
   TYPE employee_arraytype IS TABLE OF employee%ROWTYPE
        INDEX BY PLS_INTEGER;
   employee_array employee_arraytype;
BEGIN
   SELECT *
     BULK COLLECT INTO employee_array
     FROM employee
    WHERE department = 10;
   --
   FOR i IN employee_array.FIRST .. employee_array.LAST
   LOOP
      -- Do something
   END LOOP;
END;

সংঘবদ্ধ অ্যারে কোনও রেকর্ড ধরণের তৈরি করতে পারে can

আশা করি এটি সাহায্য করবে, অলি


17
VALUE_ERRORসংগ্রহটি শূন্য হলে পুনরাবৃত্তির শর্ত উত্থাপিত হয়। আমি বরং FOR i IN 1 .. employee_array.COUNTএই ক্ষেত্রে ব্যবহার করার পরামর্শ দেব
unziberla

J-chomel এর সংস্করণ ( stackoverflow.com/a/40579334/1915920 ) উপর ভিত্তি করে sys.odcivarchar2listনিচের সুবিধা আছে, এছাড়াও আপনি ফাংশন PARAM ডিফল্ট আরম্ভের জন্য যেমন হাতে একটি কন্সট্রাকটর, have যে:sys.odcivarchar2list('val1','val2')
আন্দ্রিয়াস Dietrich অনির্ণীত

11

আর একটি সমাধান হ্যাশম্যাপ হিসাবে ওরাকল সংগ্রহটি ব্যবহার করা:

declare 
-- create a type for your "Array" - it can be of any kind, record might be useful
  type hash_map is table of varchar2(1000) index by varchar2(30);
  my_hmap hash_map ;
-- i will be your iterator: it must be of the index's type
  i varchar2(30);
begin
  my_hmap('a') := 'apple';
  my_hmap('b') := 'box';
  my_hmap('c') := 'crow';
-- then how you use it:

  dbms_output.put_line (my_hmap('c')) ;

-- or to loop on every element - it's a "collection"
  i := my_hmap.FIRST;

  while (i is not null)  loop     
    dbms_output.put_line(my_hmap(i));      
    i := my_hmap.NEXT(i);
  end loop;

end;

11

আপনি একটি ব্যবহার করতে পারেন oracle defined collection

DECLARE 
  arrayvalues sys.odcivarchar2list;
BEGIN
  arrayvalues := sys.odcivarchar2list('Matt','Joanne','Robert');
  FOR x IN ( SELECT m.column_value m_value
               FROM table(arrayvalues) m )
  LOOP
    dbms_output.put_line (x.m_value||' is a good pal');
  END LOOP;
END;

আমি ইন-মেমরি অ্যারে ব্যবহার করব। তবে .COUNTউজিবেরিয়ার প্রস্তাবিত উন্নতির সাথে :

DECLARE
  TYPE t_people IS TABLE OF varchar2(10) INDEX BY PLS_INTEGER;
  arrayvalues t_people;
BEGIN
  SELECT *
   BULK COLLECT INTO arrayvalues
   FROM (select 'Matt' m_value from dual union all
         select 'Joanne'       from dual union all
         select 'Robert'       from dual
    )
  ;
  --
  FOR i IN 1 .. arrayvalues.COUNT
  LOOP
    dbms_output.put_line(arrayvalues(i)||' is my friend');
  END LOOP;
END;

আরেকটি সমাধান Hashmap ব্যবহার করতে হবে @Jchomel মত করেনি এখানে

বিশেষ দ্রষ্টব্য:

ওরাকল 12 সি এর সাহায্যে আপনি এখনই অ্যারেগুলি সরাসরি জিজ্ঞাসা করতে পারেন !


1

নীচের হিসাবে নমুনা প্রোগ্রাম এবং লিঙ্কে সরবরাহ করা হয়েছে https://oracle-concepts-learning.blogspot.com/

plsql টেবিল বা সম্পর্কিত অ্যারে।

        DECLARE 
            TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); 
            salary_list salary; 
            name VARCHAR2(20); 
        BEGIN 
           -- adding elements to the table 
           salary_list('Rajnish') := 62000; salary_list('Minakshi') := 75000; 
           salary_list('Martin') := 100000; salary_list('James') := 78000; 
           -- printing the table name := salary_list.FIRST; WHILE name IS NOT null 
            LOOP 
               dbms_output.put_line ('Salary of ' || name || ' is ' || 
               TO_CHAR(salary_list(name))); 
               name := salary_list.NEXT(name); 
            END LOOP; 
        END; 
        /
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.