我目前正在研究一個學校專案并不斷遇到障礙..我想將名稱鏈接到外鍵('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 來檢查它們是否相同,這本身不是問題,但我想回傳與數字匹配的名稱。這是否意味著我必須更改功能或更改觸發器中的某些內容?如果是這樣,你們有什么建議嗎?
提前致謝!:)
uj5u.com熱心網友回復:
如果我理解正確,你會改變功能。像這樣(我沒有你的表,所以我只是在猜測列/表名):
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;
uj5u.com熱心網友回復:
您的函式無效,=而不是==. 然后您可以從相應的表中選擇名稱:
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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358146.html
標籤:sql 甲骨文 oracle-sqldeveloper
上一篇:結束日期為空值:db2-sql
