2011-11-19 1 views
0

PostgreSQL 8.4를 사용하고 있으며 원하는 정수 배열을 전달할 수있는 일련의 함수를 작성하고 있습니다. dblink 연결 쿼리에 의해 평가됩니다.dblink 연결 쿼리에서 배열을 인수로 사용하면 오류 메시지가 표시됩니다.

--======= Create a function that accepts an array of Top(n) Books and outputs the results to a temp table =======-- 

CREATE OR REPLACE FUNCTION get_weblog_facts_dblink(VARIADIC l_spids integer[]) 
    RETURNS setof weblog_fact AS 

$BODY$ 
DECLARE 
    rec weblog_fact%rowtype; 
BEGIN 
    FOR rec IN SELECT * FROM dblink('dbname=weblog_db port=5432 host=111.111.111.001 user=db_dev password=*****', 
    'SELECT   
     id_hash,   
     logfile_id_hash,   
     logentry_timestamp,  
     ip,  
     method,  
     uri,   
     status_code,   
     bytes_transfered,  
     time_taken,  
     referrer,  
     user_agent_type_id,  
     special_id,  
     content_title_id,  
     content_release_id,  
     asset_type_id,  
     encode_type_id,  
     licensor_id,   
     broker_id,  
     campaign_id,   
     subsidized,  
     country_code3,  
     city,  
     postal_code,   
     longitude,  
     latitude,  
     language_id,   
     user_id,   
     tag,   
     app_id,  
     app_seconds,   
     app_cached,  
     cdn_id,  
     resource_name 
     FROM weblog_fact WHERE special_id = any(' || array_to_string(l_spids, ',') || ')') 
AS weblog(
    id_hash character varying(40), 
    logfile_id_hash character varying(40), 
    logentry_timestamp timestamp(6) with time zone,  
    ip cidr,   
    method character varying,  
    uri character varying,  
    status_code integer,   
    bytes_transfered bigint,   
    time_taken bigint,  
    referrer character varying,  
    user_agent_type_id integer,  
    special_id bigint,  
    content_title_id bigint,   
    content_release_id bigint,  
    asset_type_id integer,  
    encode_type_id integer,  
    licensor_id integer,   
    broker_id integer,  
    campaign_id integer,   
    subsidized boolean,  
    country_code3 character(3),  
    city character varying,  
    postal_code character varying,  
    longitude character varying,   
    latitude character varying,  
    language_id character varying,  
    user_id integer,   
    tag character varying(64),  
    app_id integer,  
    app_seconds bigint,  
    app_cached boolean,  
    cdn_id integer,  
    resource_name character varying) 
    LOOP 
     RETURN NEXT rec; 
    END LOOP; 
    RETURN ; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

을하지만 실행할 때이 :이 기능은 다음과 같습니다

SELECT * FROM get_weblog_facts_dblink (array[159783,157885,159301,159923,157952,159280,157454,157245,159831,157822]) 

내가받을 다음과 같은 오류가 :

ERROR: function get_weblog_facts_dblink(integer[]) does not exist 
LINE 1: SELECT * FROM get_weblog_facts_dblink (array[159783,157885,1... 
       ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

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

ERROR: function get_weblog_facts_dblink(integer[]) does not exist 
SQL state: 42883 
Hint: No function matches the given name and argument types. You might need to add explicit type casts. 
Character: 15 

이 함수에서 내 첫 번째 시도는을 수용 할 수있다 그 배열을 인수로 사용하고 dblink로 문제를 복잡하게 만들고 있음을 알고 있습니다. 독립 실행 형으로 dblink 선택 진술하지만, 나는 special_id IN (12345,12346,13456))

어떤 도움을 주시면 대단히 감사하겠습니다.

답변

2

plpgsql 변수를 사용하여 문자열 리터럴 안을 dblink 할 수 없습니다. PL/pgSQL은 perl이나 php와 같은 문자열 내에서 변수 확장을 알지 못합니다. 두 번째 문제는 키워드 "VARIADIC"이어야하므로이 매개 변수의 이름을 바꿉니다.

dblink(..., 
     'SELECT ... FROM weblog_fact 
      WHERE special_id = any(' || array_to_string(_variadic, ',') || ')' 
    ) 
AS weblog(... 

당신은 내가 VARIADIC가 전달되는 인수의 수에 허용 된 키워드라고 생각

+0

LOOP RETURN NEXT위한 대신 RETURN 쿼리 문을 사용할 수 있습니다 :

코드 수정하려고합니다. 'ERROR : 기능 get_weblog_facts (정수, 정수, 정수, 정수, 정수, 정수, 정수, 정수, 정수, 정수) 라인이 존재하지 않는 함수 정의과 동일한 호출을 사용하여, 나는 지금이 오류가 발생합니다 : get_weblog_facts (159783,157885,159301,159923,1 SELECT * FROM은 ... ^ 팁 : 없음 함수는 주어진 이름과 인수 유형과 일치하지 않습니다 당신은 명시 적 유형 캐스트 ​​추가해야 할 수도 있습니다 *******를.. *** 오류 **********' – Smittles

+0

좋아, 내가 잘못 함수를 호출 한 파악 I이 사용합니다. (get_weblog_facts로부터 배열 [159783,157885,159301,159923을' SELECT *를, 157952,159280,157454,157245,159831,157822])'적어도 시작하는 함수를 얻었습니다. 데이터베이스에 더 이상 연결되어 있지 않으므로 조사 할 필요가 있습니다. 감사합니다. 지금까지 도움, 파벨. – Smittles

+0

왜 _variadic 다음에 쉼표가 있고 ','다시 인용합니까? _variadic 뒤에 빈 인수가 있어야하나요? – Smittles

관련 문제