ऐसा लगता है कि आप तालिका को अनपिवट करना चाहते हैं (पिवोटिंग में कई पंक्तियों और 2 स्तंभों से कई स्तंभों के साथ 1 पंक्ति तक जाना शामिल होगा)। सबसे अधिक संभावना है कि आपको क्वेरी उत्पन्न करने के लिए डायनेमिक SQL का उपयोग करना होगा और फिर DBMS_SQL
. का उपयोग करना होगा पैकेज (या संभावित रूप से EXECUTE IMMEDIATE
) इसे निष्पादित करने के लिए। आपको एक पाइपलाइज्ड टेबल फंक्शन बनाने में भी सक्षम होना चाहिए जो अनपिवोटिंग करता हो। आपको पाइपलाइन तालिका फ़ंक्शन के भीतर भी गतिशील एसक्यूएल का उपयोग करने की आवश्यकता होगी लेकिन यह संभावित रूप से कम कोड होगा। मैं UNPIVOT
. का उपयोग करके एक शुद्ध गतिशील SQL कथन की अपेक्षा करता हूं हालांकि, अधिक कुशल होने के लिए।
एक अक्षम दृष्टिकोण, लेकिन एक जो पालन करने में अपेक्षाकृत आसान है, वह कुछ इस तरह होगा
SQL> ed
Wrote file afiedt.buf
1 create or replace type emp_unpivot_type
2 as object (
3 empno number,
4 col varchar2(4000)
5* );
SQL> /
Type created.
SQL> create or replace type emp_unpivot_tbl
2 as table of emp_unpivot_type;
3 /
Type created.
SQL> ed
Wrote file afiedt.buf
1 create or replace function unpivot_emp
2 ( p_empno in number )
3 return emp_unpivot_tbl
4 pipelined
5 is
6 l_val varchar2(4000);
7 begin
8 for cols in (select column_name from user_tab_columns where table_name = 'EMP')
9 loop
10 execute immediate 'select ' || cols.column_name || ' from emp where empno = :empno'
11 into l_val
12 using p_empno;
13 pipe row( emp_unpivot_type( p_empno, l_val ));
14 end loop;
15 return;
16* end;
SQL> /
Function created.
फिर आप उसे SQL स्टेटमेंट में कॉल कर सकते हैं (मुझे लगता है कि आप कॉलम नाम के साथ कम से कम एक तीसरा कॉलम चाहते हैं)
SQL> ed
Wrote file afiedt.buf
1 select *
2* from table( unpivot_emp( 7934 ))
SQL> /
EMPNO COL
---------- ----------------------------------------
7934 7934
7934 MILLER
7934 CLERK
7934 7782
7934 23-JAN-82
7934 1301
7934
7934 10
8 rows selected.
टॉम कायटे के शो_टेबल पाइपलाइन टेबल फ़ंक्शन को अनुकूलित करने के लिए एक अधिक कुशल तरीका होगा।