在Oracle中解决“无法在查询中执行DML”错误

前端之家收集整理的这篇文章主要介绍了在Oracle中解决“无法在查询中执行DML”错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经创建了常规功能.它已成功创建.但是当我运行它时

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,voterId);
      succ:=2;
      RETURN succ;
END;

解决方法

函数应该计算并返回结果,而不是更改数据库的状态.如果要在函数中执行DML(即,如果要在表中插入行),则无法在SELECT语句中调用函数,因为SELECT语句无法更改数据库的状态.一般来说,最好将这种东西创建为存储过程而不是存储函数.

您可以像调用存储过程一样从PL / sql调用函数

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

如果要将其创建为过程

CREATE OR REPLACE PROCEDURE reg( name in varchar2,pass in varchar2,succ out NUMBER ) 
AS 
BEGIN 
  succ:=0; 
  insert into logInfo values(loginfo_seq.nextval,0); 
  insert into passInfo values(name,voterId); 
  succ:=1; 
END;

那么你需要通过传入OUT参数来调用该过程

DECLARE
  l_success_code NUMBER;
BEGIN
  reg('awlad','12345',l_success_code);
END;

猜你在找的Oracle相关文章