मेरे पास तालिका 1 नाम की एक तालिका है। इसमें बहुत सारे कॉलम हैं, उनमें से एक कॉलम 1 है। मैं अन्य कॉलम नहीं जानता, वे कभी-कभी भी बदल सकते हैं। एक दृढ़ता से टाइप किया गया रेफ कर्सर प्रकार है जो cur1able पंक्ति का नाम तालिका 1% पंक्ति प्रकार देता है। मेरे पास एसपी 1 नाम की एक संग्रहित प्रक्रिया है जिसमें cur_Table1 प्रकार का आउट पैरामीटर है। मैं इस एसपी 1 संग्रहीत प्रक्रिया को किसी अन्य डेटाबेस से कॉल कर रहा हूं जो केवल इस संग्रहीत प्रक्रिया को देखता है, लेकिन तालिका या प्रकार स्वयं ही नहीं। मैं लौटा कर्सर से केवल कॉलम 1 का चयन कैसे करूं? मुझे पता है कि कर्सर के कॉलम के रूप में मैं रिकॉर्ड या कई चरों में ला सकता हूं, लेकिन मुझे केवल एक कॉलम के अस्तित्व के बारे में पता है, इसलिए मैं पूर्ण रिकॉर्ड या चर की सही संख्या घोषित नहीं कर सकता।ओरेकल - रेफ कर्सर से एक विशिष्ट कॉलम का चयन करें
उत्तर
आप इसे DBMS_SQL
के साथ कर सकते हैं, लेकिन यह सुंदर नहीं है।
टेबल और नमूना डेटा (COLUMN1 संख्या 1 है - 10): एक प्रक्रिया एक रेफरी कर्सर को खोलता है और चयन करता है उस के साथ
create table table1(column1 number, column2 date, column3 varchar2(1000), column4 clob);
insert into table1
select level, sysdate, level, level from dual connect by level <= 10;
commit;
पैकेज सब कुछ:
create or replace package test_pkg is
type cur_Table1 is ref cursor return table1%rowtype;
procedure sp1(p_cursor in out cur_table1);
end;
/
create or replace package body test_pkg is
procedure sp1(p_cursor in out cur_table1) is
begin
open p_cursor for select column1, column2, column3, column4 from table1;
end;
end;
/
पीएल/एसक्यूएल ब्लॉक जो रेफ कर्सर से COLUMN1 डेटा पढ़ता है:
--Basic steps are: call procedure, convert cursor, describe and find columns,
--then fetch rows and retrieve column values.
--
--Each possible data type for COLUMN1 needs to be added here.
--Currently only NUMBER is supported.
declare
v_cursor sys_refcursor;
v_cursor_number number;
v_columns number;
v_desc_tab dbms_sql.desc_tab;
v_position number;
v_typecode number;
v_number_value number;
begin
--Call procedure to open cursor
test_pkg.sp1(v_cursor);
--Convert cursor to DBMS_SQL cursor
v_cursor_number := dbms_sql.to_cursor_number(rc => v_cursor);
--Get information on the columns
dbms_sql.describe_columns(v_cursor_number, v_columns, v_desc_tab);
--Loop through all the columns, find COLUMN1 position and type
for i in 1 .. v_desc_tab.count loop
if v_desc_tab(i).col_name = 'COLUMN1' then
v_position := i;
v_typecode := v_desc_tab(i).col_type;
--Pick COLUMN1 to be selected.
if v_typecode = dbms_types.typecode_number then
dbms_sql.define_column(v_cursor_number, i, v_number_value);
--...repeat for every possible type.
end if;
end if;
end loop;
--Fetch all the rows, then get the relevant column value and print it
while dbms_sql.fetch_rows(v_cursor_number) > 0 loop
if v_typecode = dbms_types.typecode_number then
dbms_sql.column_value(v_cursor_number, v_position, v_number_value);
dbms_output.put_line('Value: '||v_number_value);
--...repeat for every possible type
end if;
end loop;
end;
/
वाह ... और मैंने सोचा कि यह "कर्सर से कॉलम 1 का चयन करें" जैसे कुछ मामूली होगा। – fejesjoco
पता नहीं है कि यह एक विकल्प है या नहीं, लेकिन क्या कोई ऐसा फ़ंक्शन बनाने का बेहतर समाधान नहीं होगा जो आपके द्वारा देखे जाने वाले विशिष्ट मूल्य को लौटाए? इससे अतिरिक्त डेटा भेजने के ओवरहेड से बचा जाता है। वैकल्पिक रूप से, आप एक कर्सर को ज्ञात फ़ील्ड के सेट के साथ परिभाषित कर सकते हैं जिसमें दोनों पक्षों के बारे में पता है।
मेरे पास एसपी के डेटाबेस पर कोई नियंत्रण नहीं है, मुझे इसे किसी तीसरे पक्ष के क्लाइंट के रूप में कहीं और कहना है। – fejesjoco
मूल प्रश्न को देखते हुए, जोनियरल्स का जवाब अभी भी सही है, इसलिए मैं इसे इस तरह चिह्नित कर दूंगा, लेकिन मैं कुछ पूरी तरह से अलग और बेहतर कर रहा हूं।
समस्या यह थी कि एसपी 1 के डेटाबेस पर मेरा कोई नियंत्रण नहीं है, मुझे इसे किसी तीसरे पक्ष के ग्राहक के रूप में कहीं और कहना है। अब मैं न केवल एसपी, बल्कि कर्सर के प्रकार को देखने की अनुमति प्राप्त करने में कामयाब रहा। मैं अभी भी तालिका नहीं दिख रहा है, लेकिन अब वहाँ एक अधिक स्वच्छ समाधान है:
अन्य डेटाबेस में मैं पहुँच प्रदान किया गया है इस प्रकार अब देखने के लिए:
type cur_Table1 is ref cursor return Table1%rowtype;
तो मेरी डेटाबेस में मैं क्या कर सकते हैं अब इस:
mycursor OtherDB.cur_Table1;
myrecord mycursor%rowtype;
...
OtherDB.SP1(mycursor);
fetch mycursor into myrecord;
dbms_output.put_line(myrecord.Column1);
देखें, मैं अभी भी मेज पर किसी भी उपयोग की जरूरत नहीं है, मैं सिर्फ कर्सर देखते हैं। कुंजी यह है कि जादुई% पंक्ति प्रकार कर्सर के लिए भी काम करता है, न केवल टेबल। यह sys_refcursor पर काम नहीं करता है, लेकिन यह दृढ़ता से टाइप किया गया है। इस कोड को देखते हुए, मुझे दूसरी तरफ कुछ बदलाव करने की परवाह नहीं है, मुझे सभी कॉलम या रिकॉर्ड्स को बिल्कुल परिभाषित करने की ज़रूरत नहीं है, मैं बस उस कॉलम को निर्दिष्ट करता हूं जिसमें मुझे रूचि है।
मैं ओरेकल के बारे में वास्तव में इस ओओपी रवैया से प्यार करता हूँ।
- 1. ओरेकल एसक्यूएल डेवलपर: रेफ कर्सर से परिणाम कैसे देखें?
- 2. ओरेकल एक कर्सर में सुधार करें
- 3. ओरेकल कर्सर
- 4. एसक्यूएल नए नामों का चयन करें जिनमें विशिष्ट नाम कॉलम
- 5. एक कॉलम का चयन करें DISTINCT SQL
- 6. एक दृश्य के कॉलम का चयन करें
- 7. एक कॉलम सिद्धांत का चयन करें DQL
- 8. सी # से आउट पैरामीटर के रूप में एक रेफ कर्सर के साथ ओरेकल फ़ंक्शन को कैसे कॉल करें?
- 9. कॉलम (ओरेकल)
- 10. अधिक कॉलम के साथ तालिका में चयन से ओरेकल डालने
- 11. एक विशिष्ट कर्सर ऑफसेट स्थिति
- 12. एसक्यूएल: एक कॉलम के विशिष्ट चयन, जबकि अन्य स्तंभों
- 13. डेटाटेबल से एक विशिष्ट कॉलम वैल्यू कैसे प्राप्त करें?
- 14. ओरेकल: उसी पंक्ति के विभिन्न कॉलम से अधिकतम मूल्य का चयन करें
- 15. आरईएफ कर्सर बनाम ओरेकल
- 16. ओरेकल एसक्यूएल - दो चयन बयान से अधिकतम
- 17. जेपीए 2 मानदंड एपीआई में विशिष्ट कॉलम का चयन करना?
- 18. केवल एक कॉलम के विशिष्ट मानों के आधार पर पंक्तियों का चयन कैसे करें
- 19. Mysql: से * का चयन करें .... एक क्षेत्र
- 20. एंड्रॉइड एसक्लाइट: विशिष्ट कॉलम से विशिष्ट डेटा कैसे पुनर्प्राप्त करें?
- 21. का चयन करें SUM() से (चयन (SELECT())
- 22. क्या कनेक्शन बंद होने पर ODP.net एक रेफ कर्सर बंद करता है?
- 23. मैट्रिक्स कॉलम का यादृच्छिक चयन
- 24. विभिन्न डेटाबेसों में कॉलम का चयन करें
- 25. मॉडल से केवल विशिष्ट विशेषताओं का चयन कैसे करें?
- 26. कैसे एक्सेल कर्सर रैप करने के लिए एक विशिष्ट श्रेणी
- 27. प्रतिबिंब GetMethod। एक और विशिष्ट विधि का चयन करें
- 28. एक्सएसएलटी एक विशिष्ट सबस्ट्रिंग युक्त सभी नोड्स का चयन करें
- 29. एसक्यूएल कथन से विशिष्ट मानों का चयन करना "चयन *"
- 30. सशर्त रूप से एक कर्सर
कृपया बताएं कि आप तर्क के प्रकारों को देखने में सक्षम होने के बिना किसी अन्य डेटाबेस (या उस मामले के लिए किसी भी डेटाबेस) में किसी प्रक्रिया को कॉल करने का प्रस्ताव देते हैं। –
मैंने "एसपी पर दूसरे पर अनुदान देना" किया था, लेकिन तालिका या प्रकार पैकेज पर नहीं, बल्कि कुछ और नहीं दिया। और यह काम करता है। – fejesjoco
ओह, और कॉलिंग पक्ष पर, मैंने निश्चित रूप से एसपी के आउट पैरामीटर को sys_refcursor में रखा है। – fejesjoco