2012-11-07 3 views
0

테이블에 타임 스탬프 값을 삽입해야합니다. 저장 프로 시저를 작성하여 값을 삽입합니다.
이것은 내 저장 프로 시저에 대한 코드입니다. 내가 쿼리 Select * From dataInsert_Schedule();를 쓸 때 포스트 그레스에서 타임 스탬프 선언하기

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; 

나는 다음과 같은 오류 있어요 :

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) 
); 
+0

채널 테이블 용 만들기를 추가하면 유용합니다. – Borys

답변

1

그것은이 같은 나를 위해 작동은 :

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

:

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

당신은 to_char 필요가 없습니다 그러면 다음과 같습니다.

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

형식 이름을이 형식으로 변환하기 위해 문자열 상수 앞에 지정할 수는 있지만 상수에만 적용됩니다. 그래서 integer '123'은 괜찮지 만 integer to_char(something) 또는 interval column_name은 허용되지 않으므로 쿼리가 실패합니다.

이 내용은 설명서의 SQL 구문 장, 특히이 단락에서 설명합니다. Constants of Other Types.
발췌 :

임의 타입의 상수를 사용하여 입력 될 수 다음의 표기 중 어느 하나로

유형 '문자열'
'문자열':: 형
CAST ('문자열 '

) 유형 AS 아래 :

,174,

::, CAST() 및 함수 호출 구문도 type 'string' 표기법에 포함되지 않는다는되는 질문에

점 관련 임의의 표현의 런타임 형식 변환을 지정하는 데 사용할 수 있습니다 임의의 표현식을 허용 할 수있는 구문은 ::cast()과는 반대입니다.