आप पैकेज का उपयोग कर सकते हैं DBMS_SQL
गतिशील प्रश्नों के साथ कर्सर बनाने और उन तक पहुँचने के लिए।
हालांकि किसी कॉलम को नाम से एक्सेस करना वास्तव में आसान नहीं है क्योंकि DBMS_SQL
पैकेज स्थिति का उपयोग करता है और एक गतिशील क्वेरी में हम निष्पादन से पहले कॉलम के क्रम को नहीं जान सकते हैं।
इसके अलावा, इस प्रश्न के संदर्भ में, ऐसा प्रतीत होता है कि हम नहीं जानते कि संकलन समय पर हम कौन सा कॉलम प्रदर्शित करना चाहते हैं, हम मान लेंगे कि हम जिस कॉलम को प्रदर्शित करना चाहते हैं वह पैरामीटर के रूप में दिया गया है।
हम DBMS_SQL.describe_columns
का इस्तेमाल कर सकते हैं
SELECT
. के कॉलम का विश्लेषण करने के लिए क्वेरी के बाद कॉलम की गतिशील मैपिंग बनाने के लिए इसे पार्स किया गया है। हम मान लेंगे कि सभी कॉलम VARCHAR2
. में डाले जा सकते हैं चूंकि हम उन्हें DBMS_OUTPUT
. के साथ प्रदर्शित करना चाहते हैं .
यहां एक उदाहरण दिया गया है:
SQL> CREATE OR REPLACE PROCEDURE display_query_column(p_query VARCHAR2,
2 p_column VARCHAR2) IS
3 l_cursor INTEGER;
4 l_dummy NUMBER;
5 l_description_table dbms_sql.desc_tab3;
6 TYPE column_map_type IS TABLE OF NUMBER INDEX BY VARCHAR2(32767);
7 l_mapping_table column_map_type;
8 l_column_value VARCHAR2(4000);
9 BEGIN
10 l_cursor := dbms_sql.open_cursor;
11 dbms_sql.parse(l_cursor, p_query, dbms_sql.native);
12 -- we build the column mapping
13 dbms_sql.describe_columns3(l_cursor, l_dummy, l_description_table);
14 FOR i IN 1 .. l_description_table.count LOOP
15 l_mapping_table(l_description_table(i).col_name) := i;
16 dbms_sql.define_column(l_cursor, i, l_column_value, 4000);
17 END LOOP;
18 -- main execution loop
19 l_dummy := dbms_sql.execute(l_cursor);
20 LOOP
21 EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
22 dbms_sql.column_value(l_cursor, l_mapping_table(p_column), l_column_value);
23 dbms_output.put_line(l_column_value);
24 END LOOP;
25 dbms_sql.close_cursor(l_cursor);
26 END;
27 /
Procedure created
हम इस प्रक्रिया को केवल रन-टाइम पर ज्ञात क्वेरी के साथ कॉल कर सकते हैं:
SQL> set serveroutput on
SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'ENAME');
SMITH
ALLEN
WARD
JONES
PL/SQL procedure successfully completed
SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'EMPNO');
7369
7499
7521
7566
PL/SQL procedure successfully completed
गतिशील SQL के साथ सावधानी बरतें:इसमें उपयोगकर्ता के समान विशेषाधिकार हैं और इसलिए यह किसी भी DML और DDL को निष्पादित कर सकता है इस स्कीमा के लिए कथन की अनुमति है।
उदाहरण के लिए, उपरोक्त प्रक्रिया का उपयोग तालिका बनाने या छोड़ने के लिए किया जा सकता है:
SQL> exec display_query_column('CREATE TABLE foo(id number)', '');
begin display_query_column('CREATE TABLE foo(id number)', ''); end;
ORA-01003: aucune instruction analysée
ORA-06512: à "SYS.DBMS_SQL", ligne 1998
ORA-06512: à "APPS.DISPLAY_QUERY_COLUMN", ligne 13
ORA-06512: à ligne 1
SQL> desc foo
Name Type Nullable Default Comments
---- ------ -------- ------- --------
ID NUMBER Y