2017-03-01 4 views
2

私はストアドプロシージャを作成しました。関数が正常に作成されます。関数を呼び出すと、エラーが発生します。どうすればこの問題を解決できますか?PostgreSQLストアドプロシージャの実行エラー

エラーは、EXECUTEコマンドで置換にformat()と変数に位置パラメータの使用をミックス

ERROR: unrecognized conversion type specifier "a" CONTEXT: PL/pgSQL function dwgcould.updatescale(integer,integer) line 6 at EXECUTE statement ********** Error ********** ERROR: unrecognized conversion type specifier "a" SQL state: 22023 Context: PL/pgSQL function dwgcould.updatescale(integer,integer) line 6 at EXECUTE statement

CREATE OR REPLACE FUNCTION scale(IN id integer, IN scale integer) RETURNS integer 
AS $$ 
DECLARE 
    result int; 
BEGIN 
    IF (SELECT COUNT(*) FROM pg_tables where tablename = format('table_%s_id',id)) > 0 then 
    EXECUTE format('update table_%s_id set geom = ST_Scale(geom, %a, %a',id, scale, scale) using id, scale; 
    EXECUTE format('update table_&s_id2 set geom = ST_Scale(geom, %a, %a',id, scale, scale) using id, scale; 
    IF FOUND THEN 
     result:= 1; 
     return result; 
    ELSE 
     result:=0; 
     return result; 
    END IF; 
    ELSE 
    result:=2; 
    return result; 
    END IF; 
END; 
$$ LANGUAGE plpgsql; 
+0

あなたは '%s'を使うべきです。 – Patrick

+0

'%a'指定子を使用しないことで、この問題をどのように解決できますか? – wildplasser

+1

'ST_Scale(geom、%a、%a' - 閉じ括弧なし) –

答えて

0

です:あなたはrow_idを返すようにしたい場合は

EXECUTE format('update table_%s_id set geom = ST_Scale(geom, %s, %s)', id, scale, scale); 

EXECUTEコマンドからUPDATEクエリで明示的に指定する必要があります。

CREATE OR REPLACE FUNCTION scale(id integer, scale integer) RETURNS integer AS $$ 
DECLARE 
    result integer; 
BEGIN 
    IF (SELECT count(*) FROM pg_tables WHERE tablename = format('table_%s_id',id)) > 0 THEN 
    EXECUTE format('UPDATE table_%s_id SET geom = ST_Scale(geom, %s, %s)', id, scale, scale) using id, scale; 
    EXECUTE format('UPDATE table_&s_id2 SET geom = ST_Scale(geom, %s, %s) 
        RETURNING row_id',id, scale, scale) INTO result; 
    RETURN result; 
    END IF; 
    RETURN 2; 
END; 
$$ LANGUAGE plpgsql; 
+0

ありがとうしかし、私は直接クエリを使用すると、たとえば、テーブルを更新するために使用されている場合は、テーブルを10_10 geom = ST_Scale(geom、150、150)。更新された行は346ですが、結果は0を返しています – Fatih

+0

更新された回答を参照してください – Patrick

+0

私は '私はちょうどクエリが行われた場合、1を返します。それ以外の場合は0を返します。私は実行形式がわからないと思います。 – Fatih

関連する問題