2017-08-30 18 views
0

私はOracle 12cとOracle SQL Developerを使用してパッケージを作成しています。私の意図は、SELECT * FROM table(test2.get_ups(0));のようなSQL文からパッケージに値を渡すことです。私は、IDEでSQL SELECT文を実行するようなテーブルを返す必要があります。関数からテーブルを返すにはどうすればよいですか?

これは私のパッケージです。私はこの問題を解決するにはどうすればよい

PLS-00103: Encountered the symbol "FOR" when expecting one of the following: begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior The symbol "begin" was substituted for "FOR" to continue.

:私がコンパイルしようとすると、私は次のエラーを取得しますか?ここで

はパッケージです:

CREATE OR REPLACE PACKAGE test2 AS 

    TYPE measure_record IS RECORD(
     x_start VARCHAR2(50), 
     x_end VARCHAR2(50), 
     trip_count NUMBER); 

    TYPE measure_table IS TABLE OF measure_record; 

    FUNCTION get_ups(x number) 
     RETURN measure_table 
     PIPELINED; 
END; 
/
CREATE OR REPLACE PACKAGE BODY test2 AS 

    FUNCTION get_ups(x number) RETURN measure_table 
     PIPELINED as 

     cursor temp_cur is 
      SELECT x1, x2, count(*) FROM t1 WHERE x1 = x; 

      for cur_rec in temp_cur 
      loop 
       pipe row(cur_rec); 
      end loop; 

     RETURN; 
    END get_ups; 
END; 

答えて

0

私はあなたがDECLAREセクションにカーソルを移動するか、そのような匿名のカーソルを使用するかなければならないと思う:

FOR cur_rec IN (SELECT x1, x2, count(*) FROM t1 WHERE x1 = x) 
LOOP 
0

いくつかの問題がありました:関数定義にはBEGINが必要です。この関数はカーソルの代わりに変数のインスタンスを返す必要があり、クエリにはGROUP BYが必要です。

以下の各変更にはコメントがあります。

create table t1(x1 number, x2 number); 

CREATE OR REPLACE PACKAGE test2 AS 

    TYPE measure_record IS RECORD(
     x_start VARCHAR2(50), 
     x_end VARCHAR2(50), 
     trip_count NUMBER); 

    TYPE measure_table IS TABLE OF measure_record; 

    FUNCTION get_ups(x number) 
     RETURN measure_table 
     PIPELINED; 
END; 
/
CREATE OR REPLACE PACKAGE BODY test2 AS 

    FUNCTION get_ups(x number) RETURN measure_table 
     PIPELINED as 

     temp measure_record; --Add temporary variable to hold the cursor values. 

     cursor temp_cur is 
      SELECT x1, x2, count(*) FROM t1 WHERE x1 = x GROUP BY x1, x2; --Add "GROUP BY". 
    BEGIN --Add "BEGIN". 
      for cur_rec in temp_cur 
      loop 
       --Assign the values to the temporary variable. 
       temp.x_start := cur_rec.x1; 
       temp.x_end := cur_rec.x2; 
       temp.trip_count := cur_rec."COUNT(*)"; 
       pipe row(temp); --Pipe the variable, not the cursor. 
      end loop; 

     RETURN; 
    END get_ups; 
END; 
/

select * from table(test2.get_ups(1)); 
+0

大体、私は同意します。カーソルはパラメータ化されているため、少し異なって見えるはずです。同様に、カーソルtemp_cur(x NUMBER)は '... –

+0

@PatrickBaconカーソルは関数パラメータを参照することができ、' X'はカーソルパラメータで渡す必要はありません。 –

+0

@WernfriedDomscheitそれは私のために12.2で動作しません。私が知る限り、PL/SQLレコード・タイプにはデフォルトのコンストラクタはなく、個別に組み立てる必要があります。レコードとテーブル型がSQL型として定義されていれば、それはうまくいくはずです。 –

関連する問題