2017-11-01 7 views
0

問題: PostgreSQLスクリプトで、データベース内の同じ項目に関連するデータを削除する行がたくさんあります。例:select文とdelete文のPostgreSQL変数

delete from <table> where <column>=180; 
delete from <anothertable> where <column>=180; 
... 
delete from <table> where <column>=180; 
commit work; 

<column>=180を参照するデータを削除する約15の削除文があります。

180を変数に置き換えようとしました。コード内のすべての行ではなく変数を変更するだけです(良いプログラマのように)。私はそれをする方法を理解するように見えない、それは働いていない。

注:私は非常に多くのSQLの初心者(私はめったにそれを使用しない)していますので、私はこれを行うには良い方法はおそらくあります知っているが、私はこの問題を解決することができますどのように私を啓発してください。

私はこれらの答えを運のない状態で試して修正するために使用しました:firstsecondthird私はthe official PostgreSQL documentationに行ったこともあり、運はありません。

これは私が(これらの行は、ちょうど実際のスクリプトでのテストではなくするためのものである)しようとしているものです:

DO $$ 
DECLARE 
    variable INTEGER: 
BEGIN 
    variable := 101; 
    SELECT * FROM <table> WHERE <column> = variable; 
END $$; 

私もちょうどこのようにそれをdelcaring試してみた:

DECLARE variable INTEGER := 101; 

私はこれは私が取得エラーである変数に数字の1を交換した後、スクリプトを実行するたびに:

SQL Error [42601]: ERROR: query has no destination for result data 
Hint: If you want to discard the results of a SELECT, use PERFORM instead. 
Where: PL/pgSQL function inline_code_block line 6 at SQL statement 

カルシウム誰かが私がどこに間違っているのか教えてくれる?スクリプト内のすべての行ではなく変数内の数値を変更するだけでいいのですが、私はそれを理解できないようです。

+2

を使用すると、変数に選択することができますが、同じように、それは結果のための先を持っていない、を選択し、そう 'perform'を使用するか、暗黙の変数assingmentとして選択結果を使用するかすることはできません、たとえば、 '情報を生成する '%'、(select * from where = variable);'(複数の行が返された場合には再び動作しません... –

答えて

1

@Vao Tsun氏によると、SELECTステートメントに宛先を定義する必要があります。それ以外の場合はPERFORMを使用してください:plpgsqlがで

--Test data 
CREATE TEMP TABLE my_table (id, description) AS 
    VALUES (1, 'test 1'), (2, 'test 2'), (101, 'test 101'); 

--Example procedure 
CREATE OR REPLACE FUNCTION my_procedure(my_arg my_table) RETURNS VOID AS $$ 
BEGIN 
    RAISE INFO 'Procedure: %,%', my_arg.id, my_arg.description; 
END 
$$ LANGUAGE plpgsql; 

DO $$ 
DECLARE 
    variable INTEGER; 
    my_record my_table%rowtype; 
BEGIN 
    variable := 101; 

    --Use your SELECT inside a LOOP to work with result 
    FOR my_record IN SELECT * FROM my_table WHERE id = variable LOOP 
     RAISE INFO 'Loop: %,%', my_record.id, my_record.description; 
    END LOOP; 

    --Use SELECT to populate a variable. 
    --In this case you MUST define a destination to your result data 
    SELECT * INTO STRICT my_record FROM my_table WHERE id = variable; 
    RAISE INFO 'Select: %,%', my_record.id, my_record.description; 

    --Use PERFORM instead of SELECT if you want to discard result data 
    --It's often used to call a procedure 
    PERFORM my_procedure(t) FROM my_table AS t WHERE id = variable; 

END $$; 

--DROP FUNCTION my_procedure(my_table);