加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

在Oracle中办理“无法在查询中执行DML”错误

发布时间:2021-03-31 17:19:20 所属栏目:站长百科 来源:网络整理
导读:我已经建设了通例成果.它已乐成建设.可是当我运行它时 select reg('awlad','01968688680','545466455','12345') from dual 它给了我这个错误: ORA-14551: cannot perform a DML operation inside a query 我怎么办理这个题目? CREATE OR REPLACE FUNCTION

我已经建设了通例成果.它已乐成建设.可是当我运行它时

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;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读