2016-08-24 4 views
1

特定のリクエストに関するヒントを探しています。PL/SQLの列タイトルへの参照

まず、Oracle11gDBのPL/SQLで作業していますが、いくつかの機能と手順を実行しています。

theese関数の1つにSELECT文があります。この関数を何度も使用して、同じテーブルから異なる値を取得したいと思います。基本的には、私は必要なデータに応じてSELECT文の列を変更する必要があります。

関数であるため、SELECTで使用するために、この関数に変数を渡す方法があるのだろうかと思いました。

私の考えでは、 "column_header_type"変数のようなものです...しかし、それは存在するとは限りません。

とにかく、これは私の関数の例である:

 FUNCTION XXX 
    (
    a IN VARCHAR2, 
    b IN VARCHAR2, 
    field IN VARCHAR2 
)RETURN VARCHAR2 is 
    l_var VARCHAR2(200); 
    BEGIN 
    SELECT field 
    INTO l_var 
    FROM TABLE01 
    WHERE COD_A = a 
    AND COD_B = b; 
    RETURN l_var; 
    END XXX; 

パラメータ「フィールドが」それは値を取得しない、VARCHAR2ことが、唯一の文字列自体はできません。

私の結果を得るための他の方法があることは知っていますが、私はいつもの残酷な石器時代のコードよりも「エレガントな」ものを試したかったのです。

ありがとうございました。 マルチェロ

+0

渡すと予想される可能性のある小さな列番号がない限り、動的SQLを使用する必要があります。どの列の値も常にl_varに収まるようになります。彼らは暗黙の変換を必要としますか、またはそれらは常に文字列ですか? –

+0

私はこのテーブルでこの機能で使用できる10列のようなものを持っていますが、これは特定のケースに過ぎません。他のケースでは数十種類あります... 幸いにもすべての列は同じタイプです。 提案していただきありがとうございます、私はそれを見ていきます –

+0

もっと生き生きした方法で穴を検索し、列にアクセスするためのクライアント側の機能を持たせることができます。 – Serg

答えて

0

あなたは、動的SQLを使用することができ、次のいずれか

FUNCTION XXX 
(
    a IN VARCHAR2, 
    b IN VARCHAR2, 
    field IN VARCHAR2 
) RETURN VARCHAR2 is 
    l_var VARCHAR2(200); 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT ' || field || 
    ' FROM TABLE01' || 
    ' WHERE COD_A = :a' || 
    ' AND COD_B = :b' 
    INTO l_var USING a, b; 
    RETURN l_var; 
END XXX; 

...クエリは列名が知られている実行時まで解析されないことを意味しています。そのオーバーヘッドはフィルタ列の値にバインド変数を使用することでわずかに緩和されます。あなたは本当にあまりにもfield値をサニタイズして、渡された予期しないものを扱う

またはクエリの異なるバージョンを持っているし、渡された文字列に基づいて、使用する決定する必要があり:

FUNCTION XXX 
(
    a IN VARCHAR2, 
    b IN VARCHAR2, 
    field IN VARCHAR2 
) RETURN VARCHAR2 is 
    l_var VARCHAR2(200); 
BEGIN 
    CASE field 
    WHEN 'column1' THEN 
     SELECT column1 
     INTO l_var 
     FROM TABLE01 
     WHERE COD_A = a 
     AND COD_B = b; 
    WHEN 'column2' THEN 
     SELECT column2 
     INTO l_var 
     FROM TABLE01 
     WHERE COD_A = a 
     AND COD_B = b; 
    ... 
    END CASE; 

    RETURN l_var; 
END XXX; 

...どのコンパイル時にコードを解析して検証することができますが、特に、fieldの多くの潜在的な値を使用すると、複製が導入され、保守が難しくなる可能性があります。それをチェックする際に渡される値の場合に注意する必要があります。

+0

アレックス、本当に助けてくれてありがとう! –

関連する問題