sql - 创建 SQL 函数时如何显示来自外键的信息?
问题描述
我目前正在从事一个学校项目并一直遇到障碍。我想获得与外键相关的名称('geleendvan' 和 'geleendaan')。这两个当前是与人员表中的 ID 匹配的数字。在我深入探讨我的问题之前,让我向您展示查询:
'''
create or replace trigger lening_bri
BEFORE
insert on lening
for each row
DECLARE
NieuweSleutel INTEGER;
Resultaat VARCHAR2(255);
Fout EXCEPTION;
BEGIN
-- eerst integriteits check uitvoeren
Resultaat := sf_check_lener_onmogelijk(:new.geleendvan,:new.geleendaan);
IF Resultaat <> 'Normaal' THEN
-- resultaat niet goed, fout forceren
RAISE fout;
END IF;
--
SELECT nvl(max(l.nummer),0)
INTO NieuweSleutel
FROM lening l;
--
NieuweSleutel := NieuweSleutel + 1;
:new.nummer := NieuweSleutel;
EXCEPTION
-- foutafhandeling
WHEN fout THEN
apex_error.add_error (p_message => resultaat,
p_additional_info => null,
p_display_location => apex_error.c_inline_in_notification );
raise;
END;
'''
上面的查询是创建贷款(lening)时的触发器,newkey(NieuweSleutel)部分是完全不相关的,但正如您在第 10 行看到的那样,这里有一个变量 Result(Resultaat),我使用以下 SQLFunction:
'''
create or replace FUNCTION sf_check_lener_onmogelijk
(in_geleendvan IN VARCHAR2,
in_geleendaan IN VARCHAR2)
RETURN VARCHAR2
is
resultaat VARCHAR2(255);
BEGIN
IF in_geleendvan == in_geleendaan THEN
resultaat := 'Toevoegen afgebroken. Persoon ['||in_geleendvan||' '||in_geleendaan||'] mogen niet het zelfde zijn :( .';
ELSE
resultaat := 'Normaal';
END IF;
RETURN resultaat;
END;
'''
如您所见,该函数会检查出借人是否与出借人不同(in_geleendvan 和 in_geleendaan)。
但问题是:该函数使用 ID 来检查它们是否相同,这本身不是问题,但我想返回与数字匹配的名称。这是否意味着我必须更改功能或更改触发器中的某些内容?如果是这样,你们有什么建议吗?
提前致谢!:)
解决方案
您的功能无效,=
而不是==
. 然后您可以从相应的表中选择名称:
create or replace FUNCTION sf_check_lener_onmogelijk(
in_geleendvan IN lening.geleendvan%TYPE,
in_geleendaan IN lening.geleendaan%TYPE
)
RETURN VARCHAR2
IS
v_name_gv people.name%TYPE;
v_name_ga people.name%TYPE;
BEGIN
IF in_geleendvan = in_geleendaan THEN
SELECT name
INTO v_name_gv
FROM people
WHERE id = in_geleendvan;
SELECT name
INTO v_name_ga
FROM people
WHERE id = in_geleendaan;
RETURN 'Toevoegen afgebroken. Persoon ['||v_name_gv||' '||v_name_ga||'] mogen niet het zelfde zijn :( .';
ELSE
RETURN 'Normaal';
END IF;
END;
/
然后你不应该找到最大值nummer
并添加一个;使用序列或IDENTITY
列(并忽略序列中的任何间隙):
CREATE TABLE lening (
nummer INTEGER
GENERATED ALWAYS AS IDENTITY
CONSTRAINT lenng__nummer__pk PRIMARY KEY,
geleendvan VARCHAR2(20),
geleendaan VARCHAR2(20)
);
那么你的触发器可以是:
create or replace trigger lening_bri
BEFORE insert on lening
for each row
DECLARE
Resultaat VARCHAR2(255);
Fout EXCEPTION;
BEGIN
-- eerst integriteits check uitvoeren
Resultaat := sf_check_lener_onmogelijk(:new.geleendvan,:new.geleendaan);
IF Resultaat <> 'Normaal' THEN
RAISE fout;
END IF;
EXCEPTION
-- foutafhandeling
WHEN fout THEN
apex_error.add_error(
p_message => resultaat,
p_additional_info => null,
p_display_location => apex_error.c_inline_in_notification
);
raise;
END;
/
db<>在这里摆弄
推荐阅读
- php - 在 laravel 6 中从会话数组中插入数据
- node.js - 当成员具有增强角色时,不和谐角色集会出错
- python - 使用 MatPlotLib 仅显示 Python 中的最后一个图
- swiftui - 有没有办法有条件地翻转 HStack 内容的顺序?
- c# - 尝试从插入语句中检索返回值时出现“索引超出数组范围”错误
- owl - 两个类定义的交集
- android - 如何使用深层链接打开我的应用,而不是重定向到 Google Play 商店网站?
- javascript - 如何调试 nodejs API
- python - Docker 和 Flask 项目在文件更改时刷新
- docker - Nginx proxy_pass如何传递路由参数