0

タイムスタンプ値をテーブルに挿入する必要があります。ストアド プロシージャを記述して値を挿入しています。
これは、ストアド プロシージャのコードです。

CREATE OR REPLACE FUNCTION dataInsert_Schedule() RETURNS boolean As
$$
DECLARE
    i integer;
    j integer;
    dur integer;
    tup Channel%rowtype;
BEGIN
    FOR tup IN SELECT * FROM Channel
    LOOP
        for i in 0..6 LOOP --days
            for j in 0..23 LOOP  --hours
                dur = round((random() * 2) + 1);
                IF i + dur > 24 then
                    dur = 24 - i;
                END IF;
                INSERT INTO Schedule VALUES(tup.Channel_ID, round((random() * 999) + 1),( current_date + (integer to_char(i,'9')) )+ (interval to_char(j,'99') || ' hour'), (interval  dur ||' hour'));
                i = i + dur - 1;
            END LOOP;
        END LOOP;
    END LOOP;
    return true;
END
$$ LANGUAGE plpgsql;

クエリを作成するSelect * From dataInsert_Schedule();と、次のエラーが発生しました。

ERROR:  syntax error at or near "to_char"
LINE 1: ...d((random() * 999) + 1),( current_date + (integer to_char( $...
                                                             ^
QUERY:  INSERT INTO Schedule VALUES( $1 , round((random() * 999) + 1),( current_date + (integer to_char( $2 ,'9')) )+ (interval to_char( $3 ,'99') || ' hour'), (interval  $4  ||' hour'))
CONTEXT:  SQL statement in PL/PgSQL function "datainsert_schedule" near line 15

********** Error **********

ERROR: syntax error at or near "to_char"
SQL state: 42601
Context: SQL statement in PL/PgSQL function "datainsert_schedule" near line 15

私は最初にこれを試しました

INSERT INTO Schedule VALUES(tup.Channel_ID, round((random() * 999) + 1),( current_date + (integer ''||i) )+ (interval (j ||' hour')), (interval dur ||' hour'));

挿入方法ですが、同じ種類のエラーが発生していました。

なぜこのエラーが発生するのですか?

そして、scheduleテーブルは次のように定義されます。

CREATE TABLE Schedule(
Channel_ID Integer  REFERENCES Channel(Channel_ID),
Program_ID Integer  REFERENCES Program(Program_ID),
Start_Time Timestamp NOT NULL,
Duration Interval NOT NULL,
CONSTRAINT Schedule_Key PRIMARY KEY(Channel_ID, Program_ID)
);
4

2 に答える 2

1

それは私のためにこのように機能します:

select (to_char(1,'99') || ' hour')::interval;

あなたは必要ありませんto_char

select (1 || ' hour')::interval;
 interval 
----------
 01:00:00

だからこれはそれだろう:

INSERT INTO Schedule
VALUES (
tup.Channel_ID,
round((random() * 999) + 1),
(current_date + i::integer) + (j || ' hour')::interval,
(dur ||' hour')::interval
)
于 2012-11-07T14:51:19.520 に答える
0

文字列定数の前に型名を指定して、この型にキャストすることもできますが、これは定数にのみ適用されます。それでinteger '123'問題ありませんが、integer to_char(something)またはinterval column_name許可されていないため、クエリが失敗します。

これは、マニュアルの SQL 構文の章、特にこの段落で説明されています: Constants of Other Types
抜粋:

次のいずれかの表記法を使用して、任意の型の定数を入力できます。

type 'string'
'string'::type
CAST ('string' AS type )

以下:

::、CAST()、および関数呼び出し構文を使用して、任意の式の実行時の型変換を指定することもできます

質問に関連するポイントは、および とtype 'string'は異なり、任意の式を受け入れることができる構文には記法が含まれていないということです。::cast()

于 2012-11-07T18:39:22.000 に答える