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

Oracle:कुंजी सूची का उपयोग करके कुशलतापूर्वक पंक्तियों का चयन कैसे करें

IN . के लिए मान पास करना अच्छा अभ्यास नहीं है स्ट्रिंग संयोजन के रूप में स्थिति। पहली चीजें, निश्चित रूप से, सुरक्षा और शुद्धता, लेकिन अगला बिंदु प्रदर्शन है।
हर बार जब आप स्टेटमेंट को कॉल करते हैं तो डेटाबेस इंजन इसे पार्स करता है, एक क्वेरी प्लान बनाता है और उसके बाद SQL स्टेटमेंट में निर्दिष्ट क्रियाएं करता है।
यदि आप हर बार स्क्रैच से क्वेरी टेक्स्ट बनाते हैं, फिर सभी तीन चरणों को हर बार निष्पादित किया जाता है। यहां तक ​​कि आप oci_parse() . पर भी कॉल कर सकते हैं केवल एक बार और $stmt . का पुन:उपयोग करें आपूर्ति किए गए मापदंडों के विभिन्न सेट के साथ चर।
इसलिए, सर्वोत्तम प्रदर्शन के लिए आपको बाइंड वैरिएबल का उपयोग करना चाहिए और इसे oci_bind_array_by_name

अतिरिक्त बात यह है कि oci_fetch_all का उपयोग करके परिणाम प्राप्त करना कोड> पंक्ति दर पंक्ति परिणाम सेट पढ़ने की तुलना में तेज़ प्रदर्शन कर सकता है, लेकिन यह प्रसंस्करण परिणामों के तर्क पर निर्भर करता है।

अपडेट करें

ऐसा लगता है कि सरणी पैरामीटर पास करना केवल तभी काम करता है जब आप पीएल/एसक्यूएल ब्लॉक निष्पादित करने जा रहे हों और एसक्यूएल कथन के साथ इसका इस्तेमाल नहीं कर सकते। लेकिन एक अन्य संभावना संग्रह का उपयोग करना है पैरामीटर मानों की सूची पास करने के लिए। सरणियों के साथ भी प्रश्न की शर्तों को संतुष्ट करना संभव है, लेकिन यह तरीका कम सुरुचिपूर्ण है।
डेटाबेस को क्वेरी करने के विभिन्न तरीकों के अलावा सिस्टम सेटिंग्स जैसी चीजें हैं। PHP के मामले में php.ini . में कुछ पैरामीटर हैं फ़ाइल जो Oracle के साथ सहभागिता को नियंत्रित करती है। उनमें से एक (oci8.statement_cache_size ) क्वेरी कैशिंग और प्रदर्शन से संबंधित है।

उदाहरण

सभी उदाहरण Oracle में समान डेटा सेटअप का उपयोग करते हैं।
डेटा पास करने के लिए मैं पूर्वनिर्धारित SYS.ODCIVarchar2List चुनता हूं प्रकार, लेकिन समान विशेषताओं के साथ कस्टम प्रकार को परिभाषित करना भी संभव है (डेटा सेटअप उदाहरण में दिखाया गया है)। नीचे डेटा योजना सेटअप और डीएमएल में संग्रह का उपयोग करने के सिद्धांत को ध्वस्त करने के लिए कोड है।

SQLFiddle

create table myTable(value varchar2(100), key varchar2(100))
/

insert into myTable(value, key)
select * from (
  select 'apple', 'apple_one' from dual union all
  select 'apple', 'apple_two' from dual union all
  select 'banana', 'banana_one' from dual union all
  select 'orange', 'orange_one' from dual union all
  select 'orange', 'orange_two' from dual union all
  select 'potato', 'potato_one' from dual
)
/

create or replace type TCustomList as table of varchar2(4000)
/

create or replace package TestPackage as

  type TKeyList is table of varchar2(1000) index by binary_integer;

  function test_select(pKeyList in out TKeyList) return sys_refcursor;

end;
/

create or replace package body TestPackage is

  function test_select(pKeyList in out TKeyList) return sys_refcursor
  is               
    vParam sys.ODCIVarchar2List := sys.ODCIVarchar2List();
    vCur sys_refcursor;  
    vIdx binary_integer;
  begin                

    vIdx := pKeyList.first;
    while(vIdx is not null) loop
      vParam.Extend;
      vParam(vParam.last) := pKeyList(vIdx);
      vIdx := pKeyList.next(vIdx);
    end loop;

    open vCur for 
      select * from myTable where value in (select column_value from table(vParam))    
    ;

    return vCur;
  end;

end;
/

संग्रह प्रदर्शित करने के लिए प्रश्न:

--select by value list
select * from myTable 
where value in (
        select column_value 
        from table(Sys.ODCIVarchar2List('banana','potato'))
      )
/

--same with custom type
select * from myTable 
where value in (
        select column_value 
        from table(TCustomList('banana','potato'))
      )
/

--same with demonstration of casting 
select * from myTable 
where value in (
        select column_value 
        from table(cast(TCustomList('banana','potato') as Sys.ODCIVarchar2List))
      )
/

उदाहरण 1 - संग्रह का उपयोग करके PHP से कॉल करें

<?php
  $keyList = array('apple', 'potato');

  $conn = oci_pconnect("user_name", "user_password", "SERVER_TNS_NAME");

  $stmt = oci_parse($conn, "SELECT * FROM myTable where value in (select column_value from table(:key_list))");

  $coll = oci_new_collection($conn, 'ODCIVARCHAR2LIST','SYS');

  for ($i=0; $i < count($keyList); $i++) {
    $coll->append($keyList[$i]);
  }

  oci_bind_by_name($stmt, 'key_list', $coll, -1, OCI_B_NTY);

  oci_execute($stmt);

  while($row = oci_fetch_array($stmt, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";

  $coll->free();

  //-- Run statement another time with different parameters
  //-- without reparsing.

  $coll = oci_new_collection($conn, 'ODCIVARCHAR2LIST','SYS');
  $coll->append('banana');
  oci_bind_by_name($stmt, 'key_list', $coll, -1, OCI_B_NTY);

  oci_execute($stmt);

  while($row = oci_fetch_array($stmt, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";

  $coll->free();

  oci_free_statement($stmt);
  oci_close($conn);
?>

उदाहरण 2 - सरणी और पैकेज का उपयोग करके PHP से कॉल करें

<?php
  $keyList = array('apple', 'potato');

  $conn = oci_pconnect("user_name", "user_password", "SERVER_TNS_NAME");

  $stmt = oci_parse($conn, "begin :cur := TestPackage.test_select(:key_list); end;");

  $curs = oci_new_cursor($conn);

  oci_bind_array_by_name($stmt, "key_list", $keyList, 2, 100, SQLT_CHR);
  oci_bind_by_name($stmt, "cur", $curs, -1, OCI_B_CURSOR);

  oci_execute($stmt);
  oci_execute($curs);

  while($row = oci_fetch_array($curs, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";


  //-- Run statement another time with different parameters
  //-- without reparsing.

  $keyList = array('banana');

  oci_bind_array_by_name($stmt, "key_list", $keyList, 2, 100, SQLT_CHR);

  oci_execute($stmt);
  oci_execute($curs);

  while($row = oci_fetch_array($curs, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";

  oci_free_statement($stmt);
  oci_close($conn);
?>

उदाहरण 3 - सरणी और अनाम ब्लॉक का उपयोग करके PHP से कॉल करें

<?php
  $keyList = array('apple', 'potato');

  $conn = oci_pconnect("user_name", "user_password", "SERVER_TNS_NAME");

  $stmt = oci_parse($conn, "
    declare
      type TKeyList is table of varchar2(4000) index by binary_integer;

      pKeyList TKeyList := :key_list;
      vParam   sys.ODCIVarchar2List := sys.ODCIVarchar2List();
      vIdx     binary_integer;
    begin

      -- Copy PL/SQL array to a type which allowed in SQL context
      vIdx := pKeyList.first;
      while(vIdx is not null) loop
        vParam.Extend;
        vParam(vParam.last) := pKeyList(vIdx);
        vIdx := pKeyList.next(vIdx);
      end loop;

      open :cur for select * from myTable where value in (select column_value from table(vParam));
    end;
  ");

  $curs = oci_new_cursor($conn);

  oci_bind_array_by_name($stmt, "key_list", $keyList, 2, 100, SQLT_CHR);
  oci_bind_by_name($stmt, "cur", $curs, -1, OCI_B_CURSOR);

  oci_execute($stmt);
  oci_execute($curs);

  while($row = oci_fetch_array($curs, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";


  //-- Run statement another time with different parameters
  //-- without reparsing.

  $keyList = array('banana');

  oci_bind_array_by_name($stmt, "key_list", $keyList, 2, 100, SQLT_CHR);

  oci_execute($stmt);
  oci_execute($curs);

  while($row = oci_fetch_array($curs, OCI_ASSOC)) {
      echo "{$row['KEY']}, {$row['VALUE']}\n"; // Print the values
  }
  echo "---\n";

  oci_free_statement($stmt);
  oci_close($conn);
?>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सबसे अच्छा प्रकार 4 Oracle JDBC ड्राइवर क्या है?

  2. प्राथमिक कुंजी संयोजन कैसे प्राप्त करें जिसमें शून्य मान हो सकते हैं?

  3. ओरेकल में, क्या कॉमा द्वारा अलग किए गए बहुत बड़े स्ट्रिंग (क्लोब) को बेहतर प्रदर्शन के साथ तालिका में परिवर्तित करना संभव है

  4. Oracle तालिकाओं में बड़े आकार के डेटा को कैसे सम्मिलित/अपडेट करें?

  5. SQL कीमिया के माध्यम से Oracle के लिए पांडा:UnicodeEncodeError:'ascii' कोडेक वर्ण को सांकेतिक शब्दों में बदलना नहीं कर सकता