0

私はPostgresql8.4を使用しており、整数の配列を渡せるようにする一連の関数を作成しています。これは、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の問題を複雑にしていることに気付きました。スタンドアロンとしてのdblinkselectステートメントは機能しますが、を次のように変更special_id = all(VARIADIC)します。special_id IN (12345,12346,13456) )

どんな助けでも大歓迎です。

4

1 に答える 1

2

plpgsql変数を使用して文字列リテラル内のdblinkを実行することはできません-PL/pgSQLは、perlやphpのように文字列内の変数展開を認識しません。2番目の問題はキーワード「VARIADIC」である必要があるため、このパラメーターの名前を変更します。

コードを変更してみてください:

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

代わりに、FOR LOOPRETURNNEXTのRETURNQUERYステートメントを使用できます。

于 2011-11-19T06:38:10.400 に答える