2017-11-26 6 views
0

2つの表の間の列に一致する戻り値を返す関数を作成し、関数が結果を正しく返します。関数によって返されたOracleの列

select statmenetの列として関数の結果を書き込むにはどうすればいいですか?例えば

CREATE OR REPLACE FUNCTION GML.GML_GET_COLUMNS (P_PREFIX VARCHAR2) 
    RETURN VARCHAR2 
IS 
    V_COLUMNS VARCHAR2 (1000); 

    CURSOR CUR_COLUMNS 
    IS 
     SELECT COLUMN_NAME 
     FROM USER_TAB_COLUMNS 
     WHERE TABLE_NAME = 'GML_SCENARIOS' 
       AND COLUMN_NAME IN 
         (SELECT COLUMN_NAME 
          FROM GML_FILE_COLUMNS 
          WHERE UPPER (ROW_PREFIX) NOT IN 
             ('A', 'T', 'S', 'C', 'PH', 'AD') 
            AND UPPER (ROW_PREFIX) = P_PREFIX); 
BEGIN 
    FOR I IN CUR_COLUMNS 
    LOOP 
     V_COLUMNS := V_COLUMNS || ',' || I.COLUMN_NAME; 
    END LOOP; 

    RETURN V_COLUMNS; 
END; 

:ここ

は私の関数のスクリプトで関数が返す場合:私はあなたがしたいと思います

select ID,first_name,Last_name from gml_scenarios 
+2

推奨出力の例を期待通りに与えることはできますか? – 0xdb

+0

例:関数の戻り値が次の結果を示す場合:ID、First_name、Last_name。どのように私はこのステートメント(select ID、first_name、Last_name gml_scenariosから)のような列として結果を使用することができますか? –

+0

endステートメントの結果、 '' ID、first_name、last_name''か、 ' - 101、Jhon、Smith'のようなものですか? – 0xdb

答えて

0

'ID,First_name,Last_name'を、どのように私は、次の文のようになどの結果を使用することができますそのようなコードを持つ:

SQL> CREATE OR REPLACE PROCEDURE GML_GET_COLUMNS(P_PREFIX VARCHAR2,P_TABLE_NAME VARCHAR2) 
IS 

    TYPE ScnCurTyp IS REF CURSOR; 
    scn_cv ScnCurTyp; 
    scn_rec gml_scenarios%ROWTYPE; 
    sql_stmt VARCHAR2(32000); 

    CURSOR CUR_COLUMNS 
    IS 
     SELECT COLUMN_NAME 
     FROM USER_TAB_COLUMNS 
     WHERE TABLE_NAME = upper(p_table_name) 
     AND COLUMN_NAME IN 
         (SELECT COLUMN_NAME 
          FROM GML_FILE_COLUMNS 
          WHERE UPPER (ROW_PREFIX) NOT IN 
             ('A', 'T', 'S', 'C', 'PH', 'AD') 
            AND UPPER (ROW_PREFIX) = P_PREFIX) 
BEGIN 
    FOR I IN CUR_COLUMNS 
    LOOP 
     DBMS_OUTPUT.PUT(lpad(I.COLUMN_NAME,20,' ')); 
    END LOOP; 


    sql_stmt := 'SELECT id, first_name, last_name FROM '||v_table_name; 
    OPEN scn_cv FOR sql_stmt; 
    LOOP 
    FETCH scn_cv INTO scn_rec; 
    EXIT WHEN scn_cv%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(lpad(scn_rec.id,20,' ') || ' ' || lpad(scn_rec.first_name,20,' ')|| ' ' || lpad(scn_rec.last_name,20,' ')); 
    END LOOP; 
    CLOSE scn_cv; 

END; 
SQL> set serveroutput on; 
SQL> variable i_prefix varchar2; 
SQL> variable i_table varchar2; 
SQL> exec gml_get_columns(:i_prefix,:i_table); 
+0

Sir、select statemenetでこのコードを使用するにはどうすればいいですか?私はまだ新鮮なプログラマーです –

+0

@YF私の答えを編集しました、これが役に立つと願っています –

+0

たとえば、関数の結果が4列の場合は、静的なコードです。正しく動作しません。 –

0

このコマンドを使用して目標:あなたが言うコメントで

select 'select ' || GML.GML_GET_COLUMNS('Your text') || ' from gml_scenarios ' from dual; 
+0

あなたはそれが本当に働いていますか? – 0xdb

+0

はい、多くの文字列で連結された文字列のみの関数の戻り値はOKです –

+0

あなたはそれをテストできます –

0

...

が、あなたが開始したことを不幸である理由である

..「私はまだ新鮮なプログラマーです」非常に難しいもの。

データベースはの状態を格納するマシンであるため、SQLは厳密に型指定された言語です。 Oracle RDBMSは、実行時にSQL文の結果を予測できない場合に例外を発生させるように設計されています(理由はwhy badly-designed triggers hurl mutating table exceptions)。

したがって、'ID,First_name,Last_name'のような文字列をアセンブルしてSELECT文で使用する方法はありません。動的SQLが必要です。

だから、これを行うことができます:JavaのJDBCやODBC ResultSet

CREATE OR REPLACE FUNCTION GML.GML_GET_COLUMNS (P_PREFIX VARCHAR2) 
    RETURN sys_refcursor 
IS 
    V_COLUMNS VARCHAR2 (1000); 

    CURSOR CUR_COLUMNS 
    IS 
     SELECT COLUMN_NAME 
     FROM USER_TAB_COLUMNS 
     WHERE TABLE_NAME = 'GML_SCENARIOS' 
       AND COLUMN_NAME IN 
         (SELECT COLUMN_NAME 
          FROM GML_FILE_COLUMNS 
          WHERE UPPER (ROW_PREFIX) NOT IN 
             ('A', 'T', 'S', 'C', 'PH', 'AD') 
            AND UPPER (ROW_PREFIX) = P_PREFIX); 

    return_value sys_refcursor; 
BEGIN 
    FOR I IN CUR_COLUMNS 
    LOOP 
     V_COLUMNS := V_COLUMNS || ',' || I.COLUMN_NAME; 
    END LOOP; 

    open return_value for 
     'select '|| V_COLUMNS || ' from gml_scenarios '; 

    RETURN return_value; 
END; 

sys_refcursorマップを。 PL/SQLで使用するのは難しいです。なぜなら、目標変数を知っているものを取り出す必要があるからです。これは、Oracle 12cとその新しいDBMS_SQL.GET_RESULT()機能でも同じです。

関連する問題