MS SQL 関数を Oracle に変換しようとしていますが、問題が発生しています。彼らは、関数内に一時テーブルを作成して徐々に追加することを理由にしています。一時テーブルをカーソルに置き換えて徐々に追加することはできないようです。Oracle でこれを記述する方法を誰かがよく考えている必要があります。
ALTER FUNCTION [dbo].[F_GetDateIntervalTable]
(
@OccurredFrom datetime,
@OccurredTo datetime,
@Interval decimal
)
RETURNS @Tbl table
(
[Dts] datetime
)
AS
BEGIN
DECLARE @Count int
--DECLARE @Tbl table([Dts] datetime)
DECLARE @Dts datetime
DECLARE @SeedDts datetime
SET @Count = 1
SET @Dts = DATEADD(MINUTE, FLOOR(DATEDIFF(MINUTE,0,@OccurredFrom)/@Interval)*@Interval, 0);
SET @SeedDts = DATEADD(MINUTE, FLOOR(DATEDIFF(MINUTE,0,@OccurredFrom)/@Interval)*@Interval, 0);
SET @OccurredTo = DATEADD(MINUTE, -@Interval, @OccurredTo);
WHILE (@SeedDts < @OccurredTo)
BEGIN
SET @SeedDts = DATEADD(MINUTE, @Interval*(@Count-1), @Dts)
INSERT INTO @Tbl(Dts) VALUES(@SeedDts)
SET @Count = (@Count + 1)
END
RETURN
END
出力は次のようになります (パラメータを指定):
@OccurredFrom = '2013-01-01',
@OccurredTo = '2013-01-02',
@Interval = 60
2013-01-01 00:00:00.000
2013-01-01 01:00:00.000
2013-01-01 02:00:00.000
2013-01-01 03:00:00.000
2013-01-01 04:00:00.000
2013-01-01 05:00:00.000
2013-01-01 06:00:00.000
2013-01-01 07:00:00.000
2013-01-01 08:00:00.000
2013-01-01 09:00:00.000
2013-01-01 10:00:00.000
2013-01-01 11:00:00.000
2013-01-01 12:00:00.000
2013-01-01 13:00:00.000
2013-01-01 14:00:00.000
2013-01-01 15:00:00.000
2013-01-01 16:00:00.000
2013-01-01 17:00:00.000
2013-01-01 18:00:00.000
2013-01-01 19:00:00.000
2013-01-01 20:00:00.000
2013-01-01 21:00:00.000
2013-01-01 22:00:00.000
2013-01-01 23:00:00.000
どんなアイデアでも大歓迎です!