gpt4 book ai didi

oracle - 解决Oracle "Cannot perform DML inside a query"错误

转载 作者:行者123 更新时间:2023-12-04 17:11:48 38 4
gpt4 key购买 nike

我已经创建了常规功能。它已成功创建。但是当我运行它时

select reg('awlad','01968688680','545466455','12345') from dual

它给了我这个错误:
ORA-14551: cannot perform a DML operation inside a query

我该如何解决这个问题?
CREATE OR REPLACE FUNCTION reg(
name in varchar2,
cellNo in varchar2,
voterId in varchar2,
pass in varchar2
)
RETURN NUMBER
IS
succ NUMBER;
BEGIN
succ:=0;
insert into logInfo values(loginfo_seq.nextval,cellNo,pass,0);
succ:=1;
insert into passInfo values(name,cellNo,voterId);
succ:=2;
RETURN succ;
END;

最佳答案

函数应该计算并返回结果,而不是更改数据库的状态。如果你想做DML在函数中(即,如果您想将行插入表中),您不能在 SELECT 中调用该函数声明自 SELECT语句不能改变数据库的状态。一般来说,最好将这种东西创建为存储过程而不是存储函数。

您可以像调用存储过程一样从 PL/SQL 块中调用此函数

DECLARE
l_success_code NUMBER;
BEGIN
l_success_code := reg('awlad','01968688680','545466455','12345');
END;

如果您想将其创建为程序
CREATE OR REPLACE PROCEDURE reg( name in varchar2, 
cellNo in varchar2,
voterId in varchar2,
pass in varchar2,
succ out NUMBER )
AS
BEGIN
succ:=0;
insert into logInfo values(loginfo_seq.nextval,cellNo,pass,0);
insert into passInfo values(name,cellNo,voterId);
succ:=1;
END;

那么您需要通过传入 OUT 来调用该过程范围
DECLARE
l_success_code NUMBER;
BEGIN
reg('awlad','01968688680','545466455','12345', l_success_code);
END;

关于oracle - 解决Oracle "Cannot perform DML inside a query"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9966245/

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