Awl*_*ton 4 oracle plsql oracle10g
我已经创建了常规功能.它已成功创建.但是当我运行它时
select reg('awlad','01968688680','545466455','12345') from dual
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误:
ORA-14551: cannot perform a DML operation inside a query
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
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;
Run Code Online (Sandbox Code Playgroud)
函数应该计算并返回结果,而不是更改数据库的状态.如果要DML在函数中执行(即,如果要在表中插入行),则无法在SELECT语句中调用该函数,因为SELECT语句无法更改数据库的状态.一般来说,最好将这种东西创建为存储过程而不是存储函数.
您可以像调用存储过程一样从PL/SQL块调用此函数
DECLARE
l_success_code NUMBER;
BEGIN
l_success_code := reg('awlad','01968688680','545466455','12345');
END;
Run Code Online (Sandbox Code Playgroud)
如果要将其创建为过程
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;
Run Code Online (Sandbox Code Playgroud)
那么你需要通过传入OUT参数来调用该过程
DECLARE
l_success_code NUMBER;
BEGIN
reg('awlad','01968688680','545466455','12345', l_success_code);
END;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21657 次 |
| 最近记录: |