0

私は本当にこれについて助けが必要です.それは私の大学のプロジェクトのためであり、私は立ち往生しています.

大きなアイデアは、値の要件が満たされていない場合にユーザーにメッセージを出力し、insert ステートメントを続行できないようにするトリガーをテーブルに作成することです。

クエリをデータベースに送信し、結果があればそれを出力する doSQL(conn, "query") 関数を既に持っています。任意の SELECT、UPDATE、または INSERT はこの関数で問題なく機能しますが、複数行のクエリには問題があります。

たとえば、次のようになります。

doSQL(conn, "CREATE OR REPLACE FUNCTION najnizsza_krajowa() RETURNS trigger AS $$ BEGIN IF NEW.pensja<1500 THEN SELECT 'Pensja poniżej najniższej krajowej'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql' ");

at (後の END ではない)ERROR: syntax error at or near "END"を示すというエラーを返します。END IF;この後、トリガーステートメントを作成します

doSQL(conn, "CREATE TRIGGER pensja_check BEFORE INSERT ON pracownik FOR EACH ROW EXECUTE PROCEDURE najnizsza_krajowa();");

これは機能すると思いますが、関数をいじり続けると、関数が欠落しているとしか言えません。関数の何が間違っていますか?

編集: 要求された doSQL 関数:

void doSQL(PGconn *polaczenie, char *komenda){
PGresult *rez;

printf("%s\n", komenda);

rez = PQexec(polaczenie, komenda);
printf("Status: %s\n", PQresStatus(PQresultStatus(rez)));
printf("Komunikaty: %s\n", PQresultErrorMessage(rez));

switch(PQresultStatus(rez)) {
case PGRES_TUPLES_OK:
printTuples(rez);
break;
case PGRES_FATAL_ERROR:
printf("Coś nie tak!");
break;
}
PQclear(rez);
}

いくつかの洗練された名前で申し訳ありませんが、これがあまり問題にならないことを願っています. 助けてくれてありがとう、これは私にとって本当に重要です。

4

1 に答える 1

0

検出されたエスケープされていない一重引用符は問題ではありません。SELECTターゲットなしで plpgsql 関数を使用することはできません。あなたはそれを使用PERFORMしますが、それはまだあなたが望むものではありません. :RAISE_EXCEPTION

これをする:

ユーザーにメッセージを出力し、insert ステートメントの続行を許可しません。

代わりに使用してください:

CREATE OR REPLACE FUNCTION najnizsza_krajowa()
  RETURNS trigger AS
$$
BEGIN
IF NEW.pensja < 1500 THEN
    RAISE EXCEPTION 'Pensja poniżej najniższej krajowej';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql

または、ロールバックを回避するRAISEことができます。WARNINGRETURN NULL;

また、言語名を引用しないでください: 'plpgsql'. 文字列ではなく識別子です。

于 2014-04-01T21:00:26.427 に答える