Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle - कई मानों के साथ प्रयोग करते समय क्लॉज प्रश्न में, इसे गतिशील बनाते हुए

दुर्भाग्य से, यदि आपका संग्रह प्रकार PL/SQL (SQL के बजाय) में परिभाषित है, तो आप इसे SQL में उपयोग नहीं कर सकते क्योंकि SQL इंजन इसे संभालना नहीं जानता।

यदि इसके बजाय आपने संग्रह प्रकार को SQL में परिभाषित किया है, अर्थात

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

तब आप कुछ ऐसा कर सकते हैं

SELECT col1
  FROM table1 t1
 WHERE t1.id IN (SELECT column_value
                   FROM TABLE( <<variable of type varchar2_tbl>> ) )

Oracle संस्करण के आधार पर-- SQL में संग्रह का उपयोग करने के लिए वाक्य रचना समय के साथ विकसित हुई है- Oracle के पुराने संस्करणों में अधिक जटिल वाक्यविन्यास था।

आप पीएल/एसक्यूएल सहयोगी सरणी (आपका VARCHAR_ARRAY_TYPE) को पीएल/एसक्यूएल में एक एसक्यूएल नेस्टेड टेबल संग्रह में परिवर्तित कर सकते हैं, लेकिन इसके लिए सहयोगी सरणी के माध्यम से पुनरावृत्ति की आवश्यकता होती है और नेस्टेड टेबल भरना होता है, जो थोड़ा दर्द होता है। यह मानते हुए कि VARCHAR_TBL नेस्टेड तालिका संग्रह पहले ही बना दिया गया है

SQL> CREATE OR REPLACE TYPE varchar_tbl
         IS TABLE OF varchar2(40);

आप सहयोगी सरणी से नेस्टेड तालिका में कनवर्ट कर सकते हैं और नेस्टेड तालिका का उपयोग SQL कथन में इस तरह (SCOTT.EMP तालिका का उपयोग करके) कर सकते हैं

declare
  type varchar_array_type
    is table of varchar2(40)
       index by binary_integer;
  l_associative_array varchar_array_type;
  l_index             binary_integer;
  l_nested_table      varchar_tbl := new varchar_tbl();
  l_cnt               pls_integer;
begin
  l_associative_array( 1 ) := 'FORD';
  l_associative_array( 10 ) := 'JONES';
  l_associative_array( 100 ) := 'NOT A NAME';
  l_associative_array( 75 ) := 'SCOTT';
  l_index := l_associative_array.FIRST;
  while( l_index IS NOT NULL )
  loop
    l_nested_table.EXTEND;
    l_nested_table( l_nested_table.LAST ) :=
             l_associative_array( l_index );
    l_index := l_associative_array.NEXT( l_index );
  end loop;
  SELECT COUNT(*)
    INTO l_cnt
    FROM emp
   WHERE ename IN (SELECT column_value
                     FROM TABLE( l_nested_table ) );
  dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

चूंकि संग्रह प्रकारों के बीच कनवर्ट करना थोड़ा दर्द होता है, हालांकि, आमतौर पर नेस्टेड टेबल संग्रह (और इसे संग्रहीत प्रक्रिया में पास करना) का उपयोग करना बेहतर होगा जब तक कि कोई विशेष कारण न हो कि सहयोगी सरणी की आवश्यकता हो।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IN पैरामीटर के रूप में तालिका प्रकार के साथ संग्रहीत कार्यविधि का उपयोग करके Varchar2 डेटा सम्मिलित करने में असमर्थ

  2. मिश्रित वर्चर कॉलम का उपयोग करके परिणामों का ओरेकल ऑर्डर करना लेकिन संख्यात्मक जहां क्लॉज

  3. मूल्यों के क्रम को ध्यान में रखते हुए समूह पंक्तियाँ

  4. प्रचार को हमेशा Oracle स्ट्रीम में सक्षम रखना

  5. क्या Oracle प्रबंधित ड्राइवर async/प्रतीक्षा ठीक से उपयोग कर सकता है?