2016-11-16 175 views
0

我希望我的應用程序的客戶端間接地或使用函數調用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; 

我也嘗試了原始查詢:

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

然而,當我調用這個函數(變體1或2)所示:

select layer_250_delete(1); 

它不會從layer_250_表中刪除一行。我在stackoverflow掃描了幾十個線程,但找不到類似於我的任務的任何內容。

結構

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; ROLLBACK; '?..任何例外?.. –

回答

1

22歲,它的作用:

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

在同一集羣中創建一個數據庫並在新創建的數據庫上運行我的命令。配置是跨數據庫共享的,但我確定它會工作。如果是這樣,我會檢查結構,而不是配置。也許你有觸發器,也許是一個規則而不是刪除。不知道 - 許多不變量 –