2009-09-02 2 views
11

에서 동적 선택 결과 EXECUTE을 PL/SQL 내에서 얻으려면 어떻게해야합니까?pl/sql 내에서 동적 EXECUTE 출력 표시 sqlplus

나는 주어진 테이블의 모든 NUMBER 컬럼의 합계 수집하는 간단한 SQLPLUS 스크립트를 쓰고 있어요 :

SUM(X) | SUM(Y) | SUM(Z) | 
-------------------------- 
111 | 222 | 333 | 
:

SET SERVEROUTPUT ON 

DECLARE 
     CURSOR column_cur IS 
       SELECT column_name FROM ALL_TAB_COLS 
       WHERE owner = '&scheme_name' AND table_name = '&table_name' 
       AND data_type = 'NUMBER'; 
     sql_query VARCHAR2(32767); 
BEGIN 
     sql_query := 'select '; 
     FOR column_rec IN column_cur LOOP 
       sql_query := sql_query || 'SUM(' || column_rec.column_name || 
         ') "SUM(' || column_rec.column_name || ')", '; 

     END LOOP; 
     sql_query := substr(sql_query, 0, length(sql_query)-2) || -- remove trailing ', ' 
       ' from &scheme_name' || '.&table_name'; 
     EXECUTE IMMEDIATE sql_query; 
END; 
/

동적으로 생성 된 SQL 문이 실행될 때, 뭔가를 제공합니다

그러나 SET SERVEROUTPUT ON 인 경우에도 sqlplus 스크립트를 실행하면 다음을 얻을 수 있습니다.

PL/SQL procedure successfully completed. 

답변

11

결과를 표시하려면 SELECT에서 결과를 검색해야합니다. synthax EXECUTE IMMEDIATE sql_query INTO var1, var2.. varn을 사용합니다. 그러나 귀하의 경우 컴파일 시간에 열의 수를 알 수 없습니다.

이 다룰 수있는 여러 가지 방법이 있습니다

  1. 당신은 출력의 열을 DBMS_SQL 및 루프를 사용할 수 있습니다.
  2. 당신은 내가 1 데모 것이다 XML

의 CSV와 같은 읽을 수있는 형식으로 모든 결과에 열을 만들 수 :

SQL> DEFINE scheme_name=SYS 
SQL> DEFINE table_name=ALL_OBJECTS 
SQL> DECLARE 
    2  sql_query VARCHAR2(32767); 
    3  l_cursor NUMBER := dbms_sql.open_cursor; 
    4  l_dummy NUMBER; 
    5  l_columns dbms_sql.desc_tab; 
    6  l_value NUMBER; 
    7 BEGIN 
    8  sql_query := 'select '; 
    9  FOR column_rec IN (SELECT column_name 
10       FROM ALL_TAB_COLS 
11       WHERE owner = '&scheme_name' 
12       AND table_name = '&table_name' 
13       AND data_type = 'NUMBER') LOOP 
14  sql_query := sql_query || 'SUM(' || column_rec.column_name 
15      || ') "SUM(' || column_rec.column_name || ')", '; 
16  END LOOP; 
17  sql_query := substr(sql_query, 0, length(sql_query) - 2) 
18     || ' from &scheme_name' || '.&table_name'; 
19  dbms_sql.parse(l_cursor, sql_query, dbms_sql.NATIVE); 
20  dbms_sql.describe_columns(l_cursor, l_dummy, l_columns); 
21  FOR i IN 1..l_columns.count LOOP 
22  dbms_sql.define_column(l_cursor, i, l_columns(i).col_type); 
23  END LOOP; 
24  l_dummy := dbms_sql.execute_and_fetch(l_cursor, TRUE); 
25  FOR i IN 1..l_columns.count LOOP 
26  dbms_sql.column_value(l_cursor, i, l_value); 
27  dbms_output.put_line(l_columns(i).col_name ||' = '||l_value); 
28  END LOOP; 
29 END; 
30/

SUM(DATA_OBJECT_ID) = 260692975 
SUM(OBJECT_ID) = 15242783244 
+0

감사를 완벽! 나는 당신을 투표 할 수 있었으면 좋겠다. – Jerry

+0

Jerry, 이제 할 수있다 (나는 당신이 단지 15 명 이상의 상원 의원을 필요로한다고 믿는다) –