0

我真的需要帮助,这是为了我的大学项目,我被困住了。

最大的想法是在表上创建一个触发器,如果​​不满足值要求,它会向用户打印一条消息,并且不允许插入语句继续进行。

我已经有一个 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' ");

返回一个错误,ERROR: syntax error at or near "END"指出在END IF;(不是后来的 END)。在此之后我有一个创建触发器语句

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

去做这个:

向用户打印一条消息,并且不允许插入语句继续。

改用:

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使用WARNINGandRETURN NULL;来避免回滚。

并且不要引用语言名称:'plpgsql'. 它是一个标识符,而不是一个字符串。

于 2014-04-01T21:00:26.427 回答