创建 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;