1

現在使用している PL-SQL パッケージに大きな問題があります。

私がやりたいのは、これを行う小さなコードを作成することだけです:

関数のISセクションで:

l_tabellen_excl DBMS_utility.name_array;

コードの後半:

SELECT DISTINCT TABLE_NAME
BULK COLLECT INTO l_tabellen_excl
FROM
ALL_TAB_COLUMNS
WHERE
TABLE_NAME IN ('TAB_1', 'TAB_2');

この変数をSELECTステートメントで最終的に使用するには、次のようにします。

AND col.table_name NOT IN (SELECT * FROM TABLE (l_tabellen_excl))

私はORA-22905: cannot access rows from a non-nested table itemここに着きます。

私はただ書くことAND col.table_name NOT IN ('TAB_1','TAB_2')ができることを知っていますが、コードの最も深い穴にハードコーディングしたくありません...見つけにくく、構成可能性が低くなります。

私はたくさんのことを試しました:

type array_t is table of varchar2(10);

うまくいきません。ローカルで宣言されたコレクションを SELECT ステートメントで使用できないというエラーが表示されます。

i_tabellen_excl回避策のように、変数をローカルで宣言された型にキャストしようとしました。しかし、ORA-00902 - 無効なデータ型が発生します。

コンマで区切られたテーブル リストを含む文字列を含む VARCHAR2 を宣言しようとしましたが、機能しているように見えますが、クリーンで適切に作成された適切に設計されたコードとはかけ離れています。

関数を作成しようとするなど、言及する価値のない他のオプションを試しました。

私はこの問題で迷っています。どんなアイデアでもテストするのは素晴らしいことです。

4

1 に答える 1

1

TABLE関数を使用する場合は、 TYPEをデータベースに格納するOBJECTタイプとして作成し、それを使用して関数を作成する必要があります。後で、PL/SQL コードで表関数を使用できます。

それ以外の場合は、ネストされたテーブルを使用して、コレクション オブジェクトを参照するために再度ループする必要があります。

SET serveroutput ON
DECLARE
type str_typ
IS
  TABLE OF VARCHAR2(200);
  str_sub str_typ := str_typ ();
BEGIN
  SELECT DISTINCT TABLE_NAME BULK COLLECT INTO str_sub FROM ALL_TAB_COLUMNS;
  FOR i IN 1..str_sub.count
  LOOP
    dbms_output.put_line(str_sub(i));
  END LOOP;
END;
/

したがって、データベース オブジェクトとして使用することはできません。そのため、型をオブジェクト型として作成し、テーブル関数を作成する必要があります。

例えば、

タイプを作成する

SQL> CREATE TYPE col_type AS OBJECT (
  2    col_name VARCHAR2(50)
  3  );
  4  /

Type created.

SQL> CREATE TYPE col_sub_type IS TABLE OF col_type;
  2  /

Type created.

テーブル関数を構築する

SQL> CREATE OR REPLACE FUNCTION get_col_tab RETURN col_sub_type AS
  2    l_type  col_sub_type := col_sub_type();
  3  BEGIN
  4    FOR i IN (SELECT DISTINCT TABLE_NAME t_name FROM ALL_TAB_COLUMNS) LOOP
  5      l_type.extend;
  6      l_type(l_type.last) := col_type(i.t_name);
  7    END LOOP;
  8
  9    RETURN l_type;
 10  END;
 11  /

Function created.

試して

SELECT *
FROM   TABLE(get_col_tab());
于 2015-10-12T08:49:27.617 に答える