2016-12-21 10 views
0

私は、1つの大文字と小文字を区別しないvarchar2をパラメータとして与えられたテーブルから返す方法を探しています。 データベースは、最初の列として調べるように構成されています。 これは私が得たものである:t_namはの大文字バージョンを使用することで、最初の変数は、それらを比較するためにある、関数が探すために何を受信して​​、テーブルの名前がに見て関数にテーブル名を渡す

create or replace function generic_return(nam varchar2, table_n varchar2) 
return varchar2 
as 
    case_insensitive varchar2(300); 
    case_ins varchar2(300); 
    colu varchar2(30); 
    t_nam varchar2(30):=upper(table_n); 
    cursor point is execute inmediate select colu from t_nam; 
    cursor col is select column_name from cols where table_name=t_nam; 
    non_existent_table exception; 
begin 
    case_ins:=upper(rtrim(ltrim(nam))); 
    open col; 
    fetch col into colu; 
    close col; 
    select column_name from cols where table_name=upper(table_n); 
    if colu is null then 
     raise non_existent_table; 
    end if; 

    open point; 
    loop 
    fetch point into case_insensitive; 
    exit when point%notfound; 
    if upper(case_insensitive)=case_ins then 
     return case_insensitive;   
    end if; 
    end loop; 
    close point; 
    return null; 
end;  
/

2番目のパラメータ...とそこから巨大な混乱がある:私はテーブルのcolから列名を取得し、colsから、そして私はカーソルを作ることを試みるかどうかを確認するタプルは、同じ変更最初のパラメータかどうか、それが起こった場合は、テーブルの未修正バージョンを返す必要があります。それ以外の場合は、nullを返す必要があります。これは、それを使用する各プロシージャで扱う処理が異なります。 null私は無駄を意味し、文字列は意味しません。

+0

ご質問は広くunanswerableです:

次に、あなたのような何かを試みることができます。私たちがあなたのお手伝いをしたいと思ったら、あなたが望むものを説明するためにそれを編集する必要があります。いくつかのサンプルデータと望ましい出力を投稿することは、常に良い考えです。 – APC

答えて

2

はい、あなたは正しいです。それはかなり大きな混乱です。 :-)

まず、明示的カーソルをexecute immediate文として宣言することはできません。あなたがテーブルの最初の列をしたい場合は

次に、あなたが

WHERE column_id = 1 

を指定する必要があり、その後、あなただけSELECT-INTO経由でそれをつかむことができ、明示カーソルの必要はありません。

my_cur SYS_REFCURSOR; 
BEGIN 
... 
    OPEN my_cur FOR 'SELECT ' || first_col || ' FROM ' || t_name; 
    LOOP 
     FETCH my_cur INTO case_insensitive; 
     EXIT WHEN my_cur%NOTFOUND; 
     ... logic for match .... 
    END LOOP; 
    CLOSE my_cur; 
関連する問題