首页 > 解决方案 > 创建 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 来检查它们是否相同,这本身不是问题,但我想返回与数字匹配的名称。这是否意味着我必须更改功能或更改触发器中的某些内容?如果是这样,你们有什么建议吗?

提前致谢!:)

标签: sqloracleoracle-sqldeveloper

解决方案


您的功能无效,=而不是==. 然后您可以从相应的表中选择名称:

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<>在这里摆弄


推荐阅读