1

月次レポートでユーザーが行った選択に従って、月次データの値を表示する関数を作成しようとしています。以下のコード スニペットは、入れ子になったテーブルの値を取得しようとしているだけです。入れ子になったテーブルにデータが正常に読み込まれたら、関数を呼び出してテーブルを表示します。いくつか試してみました。しかし、データの読み込み中に問題が発生しています。以下は、この関数を作成するための 2 つの異なる SQL ですが、どちらも間違った値に関して同じエラーが発生しています。私はいくつかのことを試しましたが、役に立ちませんでした:

スニペット 1:

/* Formatted on 10/16/2012 8:40:45 AM (QP5 v5.215.12089.38647) */

CREATE OR REPLACE TYPE tempObject AS OBJECT
(
   kpiid number,
   kpigroup VARCHAR2 (300)
);

CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject;


CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
   mainarea IN VARCHAR2)

   RETURN tempTable
IS
   MonthlyData   temptable := temptable ();
   n             INTEGER := 0;

BEGIN

   IF (mainarea = 'ALL')

   THEN
      FOR r IN (SELECT DISTINCT kpiid, kpigroup
                  FROM kpi_summary_reporting
                 WHERE kpifrequency = 'Monthly' AND active_ind = 'Y')
      LOOP
         monthlydata.EXTEND;
         n := n + 1;
         monthlydata (n) := tempobject (r.kpiid, r.kpigroup);
      END LOOP;
  END IF;

   RETURN MonthlyData;
END;

エラー: [エラー] PLS-00306 (26: 29): PLS-00306: 'TEMPOBJECT' の呼び出しで引数の数または型が間違っています

スニペット 2:

/* Formatted on 10/16/2012 8:27:22 AM (QP5 v5.215.12089.38647) */
CREATE OR REPLACE TYPE tempObject AS OBJECT
(
   kpiid NUMBER,
   kpigroup VARCHAR2 (300)
);

CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject;


CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
   mainarea IN VARCHAR2)
   RETURN tempTable
AS
   MonthlyData   temptable := temptable ();
BEGIN
   IF (mainarea = 'ALL')
   THEN
      SELECT DISTINCT ksr.kpiid, ksr.kpigroup
        INTO MonthlyData 
        FROM kpi_summary_reporting ksr
       WHERE kpifrequency = 'Monthly' AND active_ind = 'Y';
   ELSE
      SELECT DISTINCT kpiid, kpigroup
        INTO MonthlyData
        FROM kpi_summary_reporting;
   END IF;

   RETURN MonthlyData;
END;

エラー: [エラー] ORA-00947 (24: 9): PL/SQL: ORA-00947: 値が不足しています

4

1 に答える 1

0

サーバーの PGA のネストされたテーブルにデータ全体をロードすることが本当に理にかなっているほど、データが十分に小さいと仮定して、このようなことを行います。データ量が多い場合は、代わりにパイプライン化されたテーブル関数を使用することをお勧めします。

ネストしたテーブルはオブジェクト型のテーブルであるため、オブジェクト型コンストラクターを使用する必要があります。

CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
   mainarea IN VARCHAR2)
   RETURN tempTable
IS
   MonthlyData   temptable;
BEGIN
   IF (mainarea = 'ALL')
   THEN
      SELECT tempObject( kpiid, kpigroup )
        BULK COLLECT INTO monthlydata
        FROM kpi_summary_reporting
       WHERE kpifrequency = 'Monthly' 
         AND active_ind = 'Y';
   END IF;

   RETURN MonthlyData;
END;

DISTINCTクエリに a が表示されると、私はいつも疑わしいです。削除する必要がある重複した行を取得することを本当に期待していますか? そうでない場合は、上記のように を削除したほうがよいでしょうDISTINCT。が本当に必要な場合はDISTINCT、オブジェクト タイプにMAPまたはORDERメソッドが必要になるため、例が少し複雑になります。

この作業のデモンストレーション

SQL> CREATE OR REPLACE TYPE tempObject AS OBJECT
  2  (
  3     kpiid NUMBER,
  4     kpigroup VARCHAR2 (300)
  5  );
  6  /

Type created.

SQL> CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject;
  2  /

Type created.

SQL> create table kpi_summary_reporting (
  2  kpiid integer,
  3  kpigroup varchar2(300),
  4  kpifrequency varchar2(30),
  5  active_ind varchar2(1)
  6  );

Table created.

SQL> insert into kpi_summary_reporting values( 1, 'Foo', 'Monthly', 'Y' );

1 row created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE FUNCTION Monthly_All_Data (
  2     mainarea IN VARCHAR2)
  3     RETURN tempTable
  4  IS
  5     MonthlyData   temptable;
  6  BEGIN
  7     IF (mainarea = 'ALL')
  8     THEN
  9        SELECT tempObject( kpiid, kpigroup )
 10          BULK COLLECT INTO monthlydata
 11          FROM kpi_summary_reporting
 12         WHERE kpifrequency = 'Monthly'
 13           AND active_ind = 'Y';
 14     END IF;
 15     RETURN MonthlyData;
 16* END;
 17  /

Function created.

SQL> select monthly_all_data( 'ALL' ) from dual;

MONTHLY_ALL_DATA('ALL')(KPIID, KPIGROUP)
--------------------------------------------------------------------------------
TEMPTABLE(TEMPOBJECT(1, 'Foo'))
于 2012-10-16T16:03:00.573 に答える