帆软js中执行oracle update分享
在填报报表中,有个需求,通过一个按钮调用oracle存储过程,执行update语句,重置密码
js代码如下
//获取C2单元格值 var vgh=_g().getCellValue(0, 2, 1); var sql="CALL HBI.PY_ResetPwd('"+vgh+"')"; var res=FR.remoteEvaluate('=sql("Oracle","'+sql+'",1,1)');
存储过程如下:
CREATE OR REPLACE PROCEDURE PY_ResetPwd( USER_ID IN VARCHAR2 ) AS BEGIN UPDATE HBI.T_NORMAL_ACCOUNT SET PASSWORD='000000' WHERE ACCOUNT_NAME=USER_ID; COMMIT; END;
在操作中,运行总是报错,查看日志执行了两次,报错ORA-00900
查看大佬的帖子后https://bbs.fanruan.com/thread-76079-1-1.html,发现是sql函数的特性
但是在oracle数据库中,存储过程一般无法返回数据集
我的需求中,update 执行两次,不受影响,如果是通过存储过程insert,那岂不是行不通?
有没有一种方法,优雅的解决这个问题?
思路1 让存储过程返回数据集,经过我不断尝试,失败了
思路2 通过函数执行update操作
问了下gpt,PRAGMA AUTONOMOUS_TRANSACTION 可行,搞起
1、新建更新函数
CREATE OR REPLACE FUNCTION FY_ResetPwd( USER_ID IN VARCHAR2 --用户ID ) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN UPDATE HBI.T_NORMAL_ACCOUNT SET PASSWORD='000000' WHERE ACCOUNT_NAME=USER_ID; --显式提交事务 必须 COMMIT; --返回执行结果 RETURN '重置成功!'; EXCEPTION WHEN OTHERS THEN ROLLBACK; -- 出现异常时回滚 RETURN '!!!重置失败!!!'; END;
2、js 代码修改如下
//获取C2单元格值 var vgh=_g().getCellValue(0, 2, 1); var sql="SELECT HBI.FY_RESETPWD('"+vgh+"') FROM DUAL"; var res=FR.remoteEvaluate('=sql("Oracle","'+sql+'",1,1)');
这下执行无报错,而且执行一次,完美解决
这样还有个额外的好处,可以返回是否插入成功,并给出提示框,外层再加上更新确认窗口,完美啊!!
最终js代码
//获取C2单元格值 var vgh=_g().getCellValue(0, 2, 1); FR.Msg.confirm("提示", "确定重置用户的密码吗?", function(value) { if (value) { var sql="SELECT HBI.FY_RESETPWD('"+vgh+"') FROM DUAL"; var res=FR.remoteEvaluate('=sql("Oracle","'+sql+'",1,1)'); FR.Msg.alert("提示",res) } })
这个函数是update操作,insert并未测试,大家有需求可以测试下