2016-11-16 6 views
0

私のアプリケーションのクライアントが、DELETEステートメントを間接的に呼び出すか、関数を使用して呼び出すようにします。関数内のdeleteステートメントの実行方法

CREATE OR REPLACE FUNCTION layer_250_delete(layer_id integer) 
    RETURNS bool AS 
$BODY$ 
BEGIN  
    EXECUTE 'DELETE FROM layer_250_ WHERE id = $1' USING layer_id;  
    RETURN TRUE; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION layer_250_delete(integer) 
OWNER TO postgres; 

は私も生問い合わせてみました:これは私が試したものです

select layer_250_delete(1); 

:しかし

... 
DELETE FROM layer_250_ WHERE id = 1';  
RETURN TRUE; 
... 

を、私はこのような(バリアント1または2)この関数を呼び出すときlayer_250_テーブルから行を削除しません。私はstackoverflowでここで数十のスレッドをスキャンしましたが、私の仕事に似た何かを見つけることができませんでした。

STRUCTURE

CREATE TABLE public.layer_250_ 
(
    id integer NOT NULL DEFAULT nextval('layer_250__id_seq'::regclass), 
    feature_type character varying(100) NOT NULL, 
    feature_hash character varying(500) NOT NULL, 
    feature_uid character varying(100) NOT NULL, 
    geom geometry, 
    radius integer, 
    group_id integer, 
    object_id integer NOT NULL DEFAULT 0, 
    row_id integer NOT NULL DEFAULT 0, 
    action_time timestamp without time zone NOT NULL DEFAULT now(), 
    action_type character varying(255), 
    action_user_id integer, 
    action_user_ip character varying(255), 
    CONSTRAINT layer_250__pkey PRIMARY KEY (id), 
    CONSTRAINT layer_250__feature_uid_key UNIQUE (feature_uid), 
    CONSTRAINT enforce_dims_geom_layer_250_ CHECK (st_ndims(geom) = 2), 
    CONSTRAINT enforce_srid_geom_layer_250_ CHECK (st_srid(geom) = 3857) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE public.layer_250_ 
    OWNER TO postgres; 
+0

シェア構造? '\ d + layer_250_' –

+0

どうぞご覧ください – Jacobian

+0

'begin;を実行するとどうなりますか?説明する(分析する、バッファを入れる)DELETE FROM layer_250_ WHERE id = 1;ロールバック; '?..何か例外?.. –

答えて

1

YRS、それはありません:

t=# create table layer_250_ (id int); 
    CREATE TABLE 
    t=# insert into layer_250_ select 1; 
    INSERT 0 1 
    t=# CREATE OR REPLACE FUNCTION layer_250_delete(layer_id integer) 
    t-#  RETURNS bool AS 
    t-# $BODY$ 
    t$# BEGIN 
    t$#  EXECUTE 'DELETE FROM layer_250_ WHERE id = $1' USING layer_id; 
    t$#  RETURN TRUE; 
    t$# END; 
    t$# $BODY$ 
    t-# LANGUAGE plpgsql VOLATILE 
    t-# COST 100; 
    CREATE FUNCTION 
    t=# ALTER FUNCTION layer_250_delete(integer) 
    t-# OWNER TO postgres; 
    ALTER FUNCTION 
    t=# begin; 
    BEGIN 
    t=# select layer_250_delete(1); 
    layer_250_delete 
    ------------------ 
    t 
    (1 row) 

    t=# select * from layer_250_; 
    id 
    ---- 
    (0 rows) 

    t=# end; 
    COMMIT 
+0

それは奇妙ですが、私の場合は動作しません。おそらく、いくつかの設定のためです。 – Jacobian

+0

同じクラスタにデータベースを作成し、新しく作成したdbでmyコマンドを実行します。 configはデータベース間で共有されていますが、動作することは間違いありません。もしそうなら、私は構成ではなく、構成をチェックしたいと思います。おそらくあなたはトリガーを持っているかもしれません。おそらく、削除の代わりにルールがあります。ダニー - 多くの不変物 –

関連する問題