帆软js中执行oracle update分享

楼主
我是社区第218534位番薯,欢迎点我头像关注我哦~

在填报报表中,有个需求,通过一个按钮调用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

image-20241207212554264

image-20241207212609726

查看大佬的帖子后https://bbs.fanruan.com/thread-76079-1-1.html,发现是sql函数的特性

image-20241207212745079

但是在oracle数据库中,存储过程一般无法返回数据集

我的需求中,update 执行两次,不受影响,如果是通过存储过程insert,那岂不是行不通?

有没有一种方法,优雅的解决这个问题?


思路1 让存储过程返回数据集,经过我不断尝试,失败了

思路2 通过函数执行update操作

问了下gpt,PRAGMA AUTONOMOUS_TRANSACTION 可行,搞起

image-20241207214143445

image-20241207214155182

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("提示", "确定重置用户["+vgh+"]的密码吗?", 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)
  }
 })

image-20241207214003298

image-20241207213906577

这个函数是update操作,insert并未测试,大家有需求可以测试下

分享扩散:

沙发
发表于 2024-12-7 21:53:07
自己顶一下,搞了一晚上的成果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1回帖数 1关注人数 1468浏览人数
最后回复于:2024-12-9 09:43

任务进行中

    返回顶部 返回列表