IN
. के लिए मान पास करना अच्छा अभ्यास नहीं है स्ट्रिंग संयोजन के रूप में स्थिति। पहली चीजें, निश्चित रूप से, सुरक्षा और शुद्धता, लेकिन अगला बिंदु प्रदर्शन है।
हर बार जब आप स्टेटमेंट को कॉल करते हैं तो डेटाबेस इंजन इसे पार्स करता है, एक क्वेरी प्लान बनाता है और उसके बाद SQL स्टेटमेंट में निर्दिष्ट क्रियाएं करता है।
यदि आप हर बार स्क्रैच से क्वेरी टेक्स्ट बनाते हैं, फिर सभी तीन चरणों को हर बार निष्पादित किया जाता है। यहां तक कि आप oci_parse()
. पर भी कॉल कर सकते हैं केवल एक बार और $stmt
. का पुन:उपयोग करें आपूर्ति किए गए मापदंडों के विभिन्न सेट के साथ चर।
इसलिए, सर्वोत्तम प्रदर्शन के लिए आपको बाइंड वैरिएबल का उपयोग करना चाहिए और इसे oci_bind_array_by_name
।
अतिरिक्त बात यह है कि oci_fetch_all
का उपयोग करके परिणाम प्राप्त करना कोड>
पंक्ति दर पंक्ति परिणाम सेट पढ़ने की तुलना में तेज़ प्रदर्शन कर सकता है, लेकिन यह प्रसंस्करण परिणामों के तर्क पर निर्भर करता है।
अपडेट करें
ऐसा लगता है कि सरणी पैरामीटर पास करना केवल तभी काम करता है जब आप पीएल/एसक्यूएल ब्लॉक निष्पादित करने जा रहे हों और एसक्यूएल कथन के साथ इसका इस्तेमाल नहीं कर सकते। लेकिन एक अन्य संभावना संग्रह
का उपयोग करना है पैरामीटर मानों की सूची पास करने के लिए। सरणियों के साथ भी प्रश्न की शर्तों को संतुष्ट करना संभव है, लेकिन यह तरीका कम सुरुचिपूर्ण है।
डेटाबेस को क्वेरी करने के विभिन्न तरीकों के अलावा सिस्टम सेटिंग्स जैसी चीजें हैं। PHP के मामले में php.ini
. में कुछ पैरामीटर हैं फ़ाइल जो Oracle के साथ सहभागिता को नियंत्रित करती है। उनमें से एक (oci8.statement_cache_size
) क्वेरी कैशिंग और प्रदर्शन से संबंधित है।
उदाहरण
सभी उदाहरण Oracle में समान डेटा सेटअप का उपयोग करते हैं।
डेटा पास करने के लिए मैं पूर्वनिर्धारित SYS.ODCIVarchar2List
चुनता हूं प्रकार, लेकिन समान विशेषताओं के साथ कस्टम प्रकार को परिभाषित करना भी संभव है (डेटा सेटअप उदाहरण में दिखाया गया है)। नीचे डेटा योजना सेटअप और डीएमएल में संग्रह का उपयोग करने के सिद्धांत को ध्वस्त करने के लिए कोड है।
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);
?>