1

データベースに複数のテーブルがあります。私はそれらのテーブルの名前を見つけなければなりません。だから私は次のプログラムを書きました:

CREATE OR REPLACE FUNCTION fun_tablefinder( keyword VARCHAR2 )
RETURN NUMBER
IS
 v_query VARCHAR2(200);tablename VARCHAR2(20);
 tablename NUMBER;

 BEGIN

v_query:='SELECT count(TABLE_NAME) FROM USER_TAB_COLUMNS WHERE TABLE_NAME LIKE ''%'||upper(keyword)||'%''';
EXECUTE IMMEDIATE v_query INTO tablename;
RETURN tablename;
END;

しかし、私のクエリには修正できないエラーがあります。

tablename:= fun_tablefinder('ubl'); is not working

また、この関数を呼び出しているときに複数の行を抽出する方法についても混乱しています。ループを使用してこれらの結果を処理するにはどうすればよいですか?

よろしくお願いします。

4

1 に答える 1

3

ネストされたテーブルを返す関数が必要です。私のバージョンの関数ではdbms_debug.vc2coll、Oracleの組み込みコレクション型であるデータ型を使用しています。

BULK COLLECTを使用して、コレクションに複数の行を設定していることに注意してください。

create or replace function     fun_tablefinder( keyword VARCHAR2 )
    RETURN dbms_debug.vc2coll
IS
   tablenames dbms_debug.vc2coll;

BEGIN

    SELECT TABLE_NAME
    bulk collect into tablenames
    FROM USER_TABLES 
    WHERE TABLE_NAME LIKE upper(keyword)||'%';
    RETURN tablenames;
END;

動的SQLを使用している理由がわからないので、まったく不要です。また、USER_TAB_COULMNSから取得する複数のヒットではなく、テーブルごとに1つの行を返すUSER_TABLESをクエリすることもできます。

このクエリを使用するには、次のようにTABLE()関数をデプロイするだけです。

select * 
from table ( fun_tablefinder('UBL') );

明らかに、これはSQL関数の簡単な使用法であり、単純なSQLクエリで十分なシナリオでは完全に過剰に設計されています。

于 2012-12-26T17:17:21.507 に答える