gpt4 book ai didi

sql - PostgreSQL 和 Libpq - 创建在不满足要求时打印一行的触发器

转载 作者:行者123 更新时间:2023-11-30 17:36:09 25 4
gpt4 key购买 nike

我真的需要这方面的帮助,这是我的大学项目,但我陷入了困境。

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

我已经有一个 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:“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);
}

对一些波兰名字感到抱歉,希望这不会太重要。预先感谢您的帮助,这对我来说非常重要。

最佳答案

unescaped single quotes您检测到的问题不是。你不能SELECT在没有目标的 plpgsql 函数中。您可以使用 PERFORM 为此,但这仍然不是您想要的。 RAISE an EXCEPTION :

要执行此操作:

prints a message to the user and doesn't allow the insert statement to proceed.

使用:

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;以避免回滚。

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

关于sql - PostgreSQL 和 Libpq - 创建在不满足要求时打印一行的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com