创建 SQL 函数时如何显示来自外键的信息?
How can i show information from a foreign key when creating a SQL Function?
我目前正在做一个学校项目,但一直遇到障碍..
我想获得链接到外键的名称('geleendvan' 和 'geleendaan')。这两个目前是与一个人 table 的 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),我使用以下内容SQL函数:
'''
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 来检查它们是否相同,这本身不是问题,但我想 return 与数字匹配的名称。这是否意味着我必须更改功能或更改触发器中的某些内容?如果可以,大家有什么建议吗?
提前致谢! :)
您的函数无效,因为您想要 =
而不是 ==
。然后你可以 select 从适当的名字 table:
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<>fiddle here
如果我理解正确的话,你会改变这个功能。类似这样的事情(我没有你的表格所以我只是猜测 column/table 个名字):
CREATE OR REPLACE FUNCTION sf_check_lener_onmogelijk (
in_geleendvan IN VARCHAR2,
in_geleendaan IN VARCHAR2)
RETURN VARCHAR2
IS
resultaat VARCHAR2 (255);
l_name_geleendvan some_table.name%TYPE;
l_name_geleendaan some_table.name%TYPE;
BEGIN
IF in_geleendvan = in_geleendaan
THEN
SELECT name
INTO l_name_geleendvan
FROM some_table
WHERE id = in_geleendvan;
SELECT name
INTO l_name_geleendaan
FROM some_table
WHERE id = in_geleendaan;
resultaat :=
'Toevoegen afgebroken. Persoon ['
|| l_name_geleendvan
|| ' '
|| l_name_geleendaan
|| '] mogen niet het zelfde zijn :( .';
ELSE
resultaat := 'Normaal';
END IF;
RETURN resultaat;
END;
我目前正在做一个学校项目,但一直遇到障碍.. 我想获得链接到外键的名称('geleendvan' 和 'geleendaan')。这两个目前是与一个人 table 的 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),我使用以下内容SQL函数:
'''
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 来检查它们是否相同,这本身不是问题,但我想 return 与数字匹配的名称。这是否意味着我必须更改功能或更改触发器中的某些内容?如果可以,大家有什么建议吗?
提前致谢! :)
您的函数无效,因为您想要 =
而不是 ==
。然后你可以 select 从适当的名字 table:
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<>fiddle here
如果我理解正确的话,你会改变这个功能。类似这样的事情(我没有你的表格所以我只是猜测 column/table 个名字):
CREATE OR REPLACE FUNCTION sf_check_lener_onmogelijk (
in_geleendvan IN VARCHAR2,
in_geleendaan IN VARCHAR2)
RETURN VARCHAR2
IS
resultaat VARCHAR2 (255);
l_name_geleendvan some_table.name%TYPE;
l_name_geleendaan some_table.name%TYPE;
BEGIN
IF in_geleendvan = in_geleendaan
THEN
SELECT name
INTO l_name_geleendvan
FROM some_table
WHERE id = in_geleendvan;
SELECT name
INTO l_name_geleendaan
FROM some_table
WHERE id = in_geleendaan;
resultaat :=
'Toevoegen afgebroken. Persoon ['
|| l_name_geleendvan
|| ' '
|| l_name_geleendaan
|| '] mogen niet het zelfde zijn :( .';
ELSE
resultaat := 'Normaal';
END IF;
RETURN resultaat;
END;