2017-02-03 9 views
0

私はかなり新しいoracleです。私はすでに2日間問題の解決策を探しています。Oracleは動的SQLの結果セットを表示します

私は動的な列とテーブル名を持つ必要がありますビューがあります。そのような 何か:

DECLARE 
plsql_block VARCHAR2(500); 
BEGIN 
    plsql_block := 'SELECT CONCAT('some','column') FROM CONCAT('some','table')'; 
    EXECUTE IMMEDIATE plsql_block 
END; 

これは動作しますが、どのように私は結果を表示するには?私はすでにDBMS.OutputとLoopで試しましたが、正確には私が望むものではありません。私は、このコマンドを実行するとGUIで通常の結果セットとして表示される必要があります。私はオラクルでこれをやっているのですか?

私は おかげで

+0

ロジックをパイプライン関数に追加し、アプリケーション層で呼び出します。 –

+0

何をしたいのか明確ではありません。あなたのクエリの出力が何であるかの例を挙げることができます – XING

+1

http://www.oracle-developer.net/display.php?id=422 –

答えて

1

を撫で実は私はあなたの動的なクエリを理解していないすべての答えを感謝しています。しかし、私の理解によれば、このクエリは複数結果結果セットです。したがって、BULKを使用して、表示の目的のためだけに出力を繰り返す必要があります。

2つの方法があります。

1)出力を表示するだけです。

SET serveroutput ON; 
    DECLARE 
     plsql_block VARCHAR2(500); 
     lv_col1  VARCHAR2(10):='1'; 
     lv_col2  VARCHAR2(10):='2'; 
    type tab_var 
    IS 
     TABLE OF VARCHAR2(10); 
     tab tab_var; 
    BEGIN 
     plsql_block := 'SELECT CONCAT('||lv_col1||','||lv_col2||') FROM dual'; 
     EXECUTE immediate plsql_block bulk collect INTO tab; 
     FOR i IN tab.first..tab.last 
     LOOP 
     dbms_output.put_line(tab(i)); 
     END LOOP; 
    END; 

2)アプローチを関数にリファクタリングして、以下のように使用します。

あなたは(対応するOracleクライアント付き)のOracle 12cの上にある場合はテーブルタイプ

create or replace 
type string_table 
IS TABLE OF VARCHAR2(100); 

CREATE OR REPLACE 
    FUNCTION func_mu 
    RETURN string_table 
    AS 
    plsql_block VARCHAR2(500); 
    lv_col1  VARCHAR2(10):='1'; 
    lv_col2  VARCHAR2(10):='2'; 
    tab string_table; 
    BEGIN 
    plsql_block := 'SELECT CONCAT('||lv_col1||','||lv_col2||') FROM dual'; 
    EXECUTE immediate plsql_block bulk collect INTO tab; 
    RETURN tab; 
    END; 

SELECT * FROM TABLE(func_mu); 
+0

2番目のソリューションは、私が探していたものです。どうもありがとうございました – Patrick

0

を作成する、あなたがこれを行うことができます:私は近くにいないよので、

declare 
    l_resultset sys_refcursor; 
    l_sql_text varchar2(500) :=q'{select 'Hello, 12c!' as greeting from dual}'; 
begin 
    open l_resultset for l_sql_text; 
    dbms_sql.return_result(l_resultset); 
end; 

(未テストを現在は12cのコマンドラインです。)

関連する問題