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

पीएल/एसक्यूएल 'IN' क्लॉज के साथ समेकित क्वेरी को फिर से लिखता है

मेरा अनुमान है कि आपने vList आईडी को एक सीमित स्ट्रिंग में प्राप्त करने के लिए पहले कुछ कदम उठाए हैं (आप यह नहीं कहते कि vList कैसे पॉप्युलेट किया गया था)। एक प्रश्न के रूप में क्यों न रखें?

begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...

कई बार चलाते समय संदर्भ स्विचिंग दर्दनाक हो सकता है, लेकिन मेरे लिए सबसे बुरी बात यह है कि आप संख्याओं की सूची होने के लिए पैरामीटर इनपुट को आँख बंद करके स्वीकार कर रहे हैं, जब यह वास्तव में कुछ भी हो सकता है। यह (निर्दोष रूप से) '1,2,X' हो सकता है, और आपको एक रनटाइम त्रुटि "अमान्य संख्या" मिलेगी। या इससे भी बदतर, यह एक SQL इंजेक्शन हमला हो सकता है। सामान्य रूप से इसका बुरा अभ्यास (गतिशील sql का अपना स्थान है), लेकिन निश्चित रूप से यह नहीं कि आप इसका उपयोग कैसे कर रहे हैं।

कुछ इस तरह का प्रयास करें:

create or replace type t_num_tab as table of number;

create or replace procedure test_proc(i_list in t_num_tab) as
  type t_name_tab is table of varchar2(100);
  l_names t_name_tab;
begin
  -- get names
  select name
  bulk collect into l_names
  from user_table
  where id in (select * from table(i_list));

  -- do something with l_names
  dbms_output.put_line('Name count: ' || l_names.count);

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. ऑरैकल डेटाबेस में तालिका संशोधित कॉलम बदलें

  2. पता लगाएँ कि क्या Oracle में किसी मान में कम से कम एक संख्यात्मक अंक है

  3. ऑरैकल में रिकॉर्ड्स के समूह को कैसे मर्ज करें?

  4. Oracle डायनेमिक SQL के लिए बाइंडिंग पैरामीटर्स

  5. किसी मौजूदा कॉलम में Oracle अनुक्रम को अगले मान पर रीसेट करने का सबसे अच्छा तरीका?