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

तत्काल चयन निष्पादित करें कोई मान नहीं लौटाता

आपको में . चुनना होगा कुछ। यदि आप नहीं करते हैं तो निष्पादित भी नहीं किया गया (हालांकि इसे पार्स किया गया है)।

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  execute immediate
  'select name, surname
  from student
  where id_student = 1'
  into l_name, l_surname;
end;
/

लेकिन, किसी विशेष क्रम में नहीं:(ए) आपको डायनामिक स्टेटमेंट में शाब्दिक मान 1 को एम्बेड करने के बजाय बाइंड वेरिएबल्स का उपयोग करना चाहिए; (बी) इसे गतिशील होने की आवश्यकता नहीं है; और (सी) कॉलर वैसे भी क्वेरी द्वारा लौटाए गए मानों को नहीं देख पाएगा - जब तक कि आप OUT में चयन नहीं करते इसके बजाय तर्क, या उन्हें dbms_output() . के साथ प्रदर्शित करें (हालांकि यह वास्तव में केवल डिबगिंग के लिए उपयोग किया जाना चाहिए क्योंकि आप यह नियंत्रित नहीं कर सकते कि क्लाइंट इसे दिखाएगा)।

तो आप यह कर सकते हैं:

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  select name, surname
  into l_name, l_surname
  from student
  where id_student = 1;

  dbms_output.put_line('name=' || l_name ||', surname=' || l_surname);
end;
/

या

create or replace procedure select_procedure (
  p_name OUT student.name%TYPE,
  p_surname OUT student.name%TYPE
)
as
begin
  select name, surname
  into p_name, p_surname
  from student
  where id_student = 1;
end;
/

और अपने कॉलर को पॉप्युलेट करने के लिए अपने स्वयं के परिवर्तनीय नामों में पास करें, और उसके बाद जो कुछ भी चाहिए उसे करें। कॉलर आमतौर पर उस आईडी में भी पास होगा जिसे आप ढूंढ रहे हैं, इसलिए आपके पास 1 हार्ड-कोडेड नहीं है।

हालांकि ऐसा नहीं लगता कि इसके लिए एक प्रक्रिया वास्तव में सबसे अच्छा तंत्र है।

साथ ही, एक select ... into . का उपयोग करके (स्थिर या गतिशील) त्रुटि होगी यदि क्वेरी शून्य पंक्तियों या एक से अधिक पंक्तियों को लौटाती है। यह केवल तभी काम करेगा जब ठीक एक पंक्ति वापस आ जाए। एक कर्सर कितनी भी पंक्तियों को संभाल लेगा - लेकिन जब तक आप केवल परिणाम प्रिंट नहीं कर रहे हैं (जैसा कि @ जयंत दिखाता है) आपको इसके बजाय कर्सर को कॉलर को वापस पास करने की आवश्यकता है। आप bulk collect into . कर सकते हैं इसके बजाय एक संग्रह, लेकिन आपको अभी भी उसके साथ कुछ करना होगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle NUMBER का स्केल प्रेसिजन से बड़ा कैसे हो सकता है?

  2. varchar2(n BYTE|CHAR) डिफ़ॉल्ट -> CHAR या BYTE

  3. अल्पविराम से अलग किए गए मान को कई पंक्तियों में परिवर्तित करना

  4. एरलांग और इसकी हीप मेमोरी की खपत

  5. Oracle में एक अस्थायी तालिका में चयन करें