gpt4 book ai didi

sql - 检查约束调用函数 Oracle SQL 开发人员

转载 作者:行者123 更新时间:2023-12-04 21:13:43 24 4
gpt4 key购买 nike

Oracle SQL 开发人员是否有可能做这样的事情

CREATE FUNCTION fnCheckValid(accountidd IN NUMBER) 
RETURN NUMBER
IS retval NUMBER(4,0);
BEGIN
SELECT COUNT(accountid_fk)
INTO retval
FROM tbl_AccountAuthentications
WHERE accountid_fk = accountidd;
RETURN(retval);
END;
/


ALTER TABLE tbl_AccountAuthentications
ADD CONSTRAINT chkCheckvalid CHECK(fnCheckValid(accountid_fk) <= 1);

我不断收到的错误是
Error starting at line 999 in command:
ALTER TABLE tbl_AccountAuthentications
ADD CONSTRAINT chkCheckvalid CHECK(fnCheckValid(accountid_fk) <= 1)
Error report:
SQL Error: ORA-00904: "FNCHECKVALID": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:

该函数正在创建中,我可以找到它,但是当我尝试调用它时,我不断收到该错误

这就是我正在努力实现的目标
AccountID    RegularID     OpenID
1 5 null
1 null 10
1 null 11
1 6 <-- Forbidden

以便用户不能创建 2 个常规帐户,但可以拥有任意数量的 OpenID 帐户

表格设置如下
CREATE TABLE tbl_AccountAuthentications(
newAuthID NUMBER(4,0)
CONSTRAINT naid_pk PRIMARY KEY,
accountid_fk NUMBER(4,0)
CONSTRAINT accid_fk
REFERENCES tbl_UserAccounts(account_id),
regularid_fk NUMBER(4,0)
CONSTRAINT rgid_fk
REFERENCES tbl_StrongRoom(password_id),
openid_fk NUMBER(4,0)
CONSTRAINT opid_fk
REFERENCES tbl_OpenID(openid)
);

最佳答案

不,你不能那样做,见 Restrictions on Check Constraints :

  • Calls to user-defined functions


但是您可以使用虚拟列来解决方法
ALTER TABLE tbl_AccountAuthentications ADD (fnCheck NUMBER GENERATED ALWAYS AS (fnCheckValid(accountid_fk)) VIRTUAL);


ALTER TABLE tbl_AccountAuthentications
ADD CONSTRAINT chkCheckvalid CHECK(fnCheck <= 1);

注意,function 必须是 DETERMINISTIC,否则它不起作用。 Oracle 不会验证您的函数是否实际上是确定性的,它只是检查关键字。这是允许的(尽管它根本没有任何意义):
CREATE OR REPLACE FUNCTION DET_FUNCTION RETURN NUMBER DETERMINISTIC IS 
BEGIN
RETURN DBMS_RANDOM.RANDOM();
END;
/

关于sql - 检查约束调用函数 Oracle SQL 开发人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16778948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com