2017-09-15 6 views
1

テーブルの特定のレコード列から1つの値(varchar2データ型)を取得し、比較する変数として格納したいとします。値と条件に応じて、私は2つのカーソルのうちの1つを呼び出すつもりです。特定の列から値を選択し、それを他の値と比較する

これはすべて関数内にあります。では、アーカイブするのが最も簡単で最短の方法は何ですか?ところで、この比較は変数に値を格納せずに直接行うことができますか? (!私はオラクルの世界でちょっと新しいです)

答えて

1

あなたがしようとしている場合でも、変数にこの値を選択する必要が

「私はテーブルの特定のレコードの列から一つの値だけ(VARCHAR2データ型)を取得したいです」次のステートメントでそれを使用してください。 「値と状態に依存し、私はつもりコール2つのカーソルの一人です」

このような何か:

create or replace function get_customers 
    return sys_refcursor 
is 
    rv sys_refcursor; 
    report_type your_table.some_col%type; 
begin 
    select some_col into report_type 
    from your_table 
    where other_col = 'WHATEVER'; 

    if report_type = 'CORPORATE' then 
     open rv for 
      select * from customers 
      where type = 'CORP'; 
    else 
     open rv for 
      select * from customers; 
    end if; 

    return rv; 
end; 
+0

であるために何本のライン 'タイプ=「CORPを呼び出す dependent_value ケースcase文で呼び出しをラップすることができ'; '? – Arianit

+0

2つのカーソルを区別するもの。あなたはどのような異なった質問をあなたが持っているかについての詳細を何も提示しなかったので、私はそれらを作った。明らかに私のおもちゃのコードをあなたの実際の状況に翻訳する必要があります。 – APC

+0

カーソルのクエリは両方のケースで同じですが、唯一の違いは、1つに結合があり、もう1つではないことです。 – Arianit

1

あなたはSELECT INTO使用することができます、あなたのカーソルを宣言して(ここで私はAnnonymousのブロックを使用しました)関数でそれをラップする必要がある。もちろん、

DECLARE 
    variable_name VARCHAR2(200); 
BEGIN 

    SELECT col_name 
    INTO variable_name 
    FROM your_tab 
    WHERE specific_column = value; 

-- rest 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN ... 
    WHEN TOO_MANY_ROWS THEN ... 

END; 

を。

1

データはテーブルに格納されているため、カーソルを使用してテーブルにデータを結合し、where句に詳細を追加することで直接比較を行うことができます。

declare 
    cursor cur_1 as 
    select value1 
    from table1 a 
    join table2 b on a.fk = b.pk 
    where b.value = 'desired_value'; 

    cursor cur_2 as 
    select value2 
    from table3 c 
    join table4 d on c.fk = d.pk 
    where d.value = 'desired_value2'; 

begin 
    for rec in cur_1 loop 
    null; 
    end loop; 

    for rec2 in cur_2 loop 
    null; 
    end loop; 
end; 

動的SQLとEXECUTE IMMEDIATEを使用して、オンザフライで文を作成することもできます。あなたが何をしようとしているかについての特定の情報がなければ、あなたを特定の方向に向けるのは難しいです。

+0

これは、異なるアプローチで面白いです。しかし、あなたのコードでは、両方のカーソルが呼び出されます。しかし、私の場合、私が選択している列の価値に応じて、私はそれらのうちの1つだけを必要とします。 – Arianit

+0

はその後、カーソルが「VALUE1」は、その後cur_1 「value2の」をcur_2呼び出す... エンドケース –

関連する問題