आपके द्वारा दिखाई गई प्रक्रिया का परीक्षण करने के लिए, आप कुछ ऐसा करेंगे:
declare
l_id hr_position.id%type;
l_group_name hr_position.group_name%type;
l_group_level hr_position.group_level%type;
begin
drill_record_position('D', l_id, l_group_name, l_group_level);
dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
end;
/
लेकिन वह - या अधिक विशेष रूप से, आपकी प्रक्रिया - केवल तभी काम करती है जब पास-इन मान प्रकार के लिए क्वेरी के परिणाम सेट में बिल्कुल एक पंक्ति हो। ऐसा लगता है कि आप कई पंक्तियों की उम्मीद कर रहे हैं (जो बहुत-बहुत-पंक्तियाँ प्राप्त करेंगी), लेकिन गैर भी हो सकती हैं (जो बिना डेटा-मिलेगी)।
तो वास्तव में ऐसा लगता है कि आपका प्रश्न आपकी प्रक्रिया को लिखने के तरीके के बारे में होना चाहिए ताकि यह आपके द्वारा आजमाई गई पुनर्प्राप्ति/परीक्षण विधियों में से एक के साथ काम करे।
यदि आपकी प्रक्रिया को कई पंक्तियों को वापस करने की आवश्यकता है तो यह एक रेफरी कर्सर का उपयोग कर सकता है, जैसे:
create or replace procedure drill_record_position (
p_record_type in varchar2,
p_ref_cursor out sys_refcursor
)
as
begin
open p_ref_cursor for
select hr.id, hr.group_name, hr.group_level
from hr_position hr
join drill_position dp
on hr.id = dp.id
where dp.typevalue = p_record_type;
end drill_record_position;
/
जिसे आप कुछ इस तरह से परख सकते हैं:
declare
l_ref_cursor sys_refcursor;
l_id hr_position.id%type;
l_group_name hr_position.group_name%type;
l_group_level hr_position.group_level%type;
begin
drill_record_position('D', l_ref_cursor);
loop
fetch l_ref_cursor into l_id, l_group_name, l_group_level;
exit when l_ref_cursor%notfound;
dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
end loop;
close l_ref_cursor;
end;
/
आप इसे एक फ़ंक्शन के रूप में भी कर सकते हैं, जिसे आपके एप्लिकेशन से काम करना आसान हो सकता है:
-- drop procedure drill_record_position;
create or replace function drill_record_position (p_record_type in varchar2)
return sys_refcursor as
l_ref_cursor sys_refcursor;
begin
open l_ref_cursor for
select hr.id, hr.group_name, hr.group_level
from hr_position hr
join drill_position dp
on hr.id = dp.id
where dp.typevalue = p_record_type;
return l_ref_cursor;
end drill_record_position;
/
declare
l_ref_cursor sys_refcursor;
l_id hr_position.id%type;
l_group_name hr_position.group_name%type;
l_group_level hr_position.group_level%type;
begin
l_ref_cursor := drill_record_position('D');
loop
fetch l_ref_cursor into l_id, l_group_name, l_group_level;
exit when l_ref_cursor%notfound;
dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
end loop;
close l_ref_cursor;
end;
/
आप इसे संग्रह और एक पाइपलाइन फ़ंक्शन के साथ भी कर सकते हैं, जिसे स्थापित करने के लिए और अधिक काम है:
create type t_drill_obj as object (
-- use your real data types...
id number,
group_name varchar2(10),
group_level number
)
/
create type t_drill_tab as table of t_drill_obj
/
create or replace function drill_record_position (p_record_type in varchar2)
return t_drill_tab pipelined as
begin
for l_row in (
select t_drill_obj(hr.id, hr.group_name, hr.group_level) as obj
from hr_position hr
join drill_position dp
on hr.id = dp.id
where dp.typevalue = p_record_type
)
loop
pipe row (l_row.obj);
end loop;
return;
end drill_record_position;
/
लेकिन आप इसे किसी अन्य प्रश्न के भाग के रूप में कह सकते हैं, और यदि आपको आवश्यकता हो तो कुल योग में शामिल हो सकते हैं:
select * from table(drill_record_position('D'));