2009-09-02 6 views
11

からPL/SQL内のEXECUTEの動的選択結果を取得するにはどうすればよいですか?pl/sql内の動的EXECUTE出力を表示するsqlplus

私は与えられたテーブルのすべてのNUMBER列の合計を収集するために、単純なSQLPLUSスクリプトを書いている:、

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文のようなものを与える:

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

ただし、SET SERVEROUTPUT ONの場合でも、sqlplusスクリプトを実行すると、次のようになります。

PL/SQL procedure successfully completed. 

答えて

11

SELECTから結果を表示して表示する必要があります。シンセックスEXECUTE IMMEDIATE sql_query INTO var1, var2.. varnを使用します。しかし、あなたのケースでは、コンパイル時に列数が不明です。

あなたはこの問題に対処でき、いくつかの方法があります。

  1. あなたは出力の列にDBMS_SQLとループを使用することができます。
  2. あなたがXML

のCSVのような読みやすい形式ですべての結果の列を構築することができ、私は1デモます:

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

ジェリー、今できる(私はあなたが上の投票に15人の担当者を必要と信じている) –

関連する問題