星空2020 2023-09-16 08:10 采纳率: 64.1%
浏览 4
已结题

先从oracle查询数据,再批量insert到mysql

根据post的id从oracle查询相关姓名,年龄然后再批量insert到mysql,如何返回插入成功的数据量?
如下插入不成功,有更优方案吗?

<?php
require_once dirname(__FILE__).'/../common.php';
session_start();

$id = $_POST['id'];
$id_clause = "'" . str_replace("\n", "','", $id) . "'";  //前端换行传来的id分隔处理

require '../connect_oracle.php'; //链接oracle数据库
//通过id从oracle查询数据
 $sql1 ="select a.id,a.name,a.age,a.mark from (
select t.id,t.name,t.age,t.mark,to_char(input_time, 'yyyy-mm-dd hh24:mi:ss')as 
new_time,row_number() OVER(PARTITION BY id ORDER BY t.input_time desc) as row_flg from table t where t.id in ($id_clause) and t.mark='0') a where a.row_flg  = '1'";

$success = array();
$failed = array();
    foreach ($conn->query($sql1,PDO::FETCH_ASSOC) as $res) {
        $id = $res['ID'];
        $name= $res['NAME'];
        $age= $res['AGE'];
        $mark = $res['MARK'];
        
        require '../pdo_connect_db.php';//链接mysql
//插入mysql
        $result = $pdo->exec("INSERT INTO mytable (id,name,age,mark)
        values(
        '$id',
        '$name',
        '$age',
        '$mark')");
        
    }
    if ($result > 0)    
        {
            $success[] = array('code' => 0, 'msg' => '发送成功'); 
        }else{
            $failed[] = array('code' => 1, 'msg' => '发送失败');
        } 
    echo json_encode(array_merge($success, $failed));

?>

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-16 10:04
    关注

    【以下回答由 GPT 生成】

    优化后的代码如下所示:

    <?php
    require_once dirname(__FILE__).'/../common.php';
    session_start();
    
    $id = $_POST['id'];
    $id_clause = str_replace("\n", "','", $id);  // 前端换行传来的id分隔处理
    
    require '../connect_oracle.php'; // 链接Oracle数据库
    // 通过id从Oracle查询数据
    $sql1 = "select a.id,a.name,a.age,a.mark from (
    select t.id,t.name,t.age,t.mark,to_char(input_time, 'yyyy-mm-dd hh24:mi:ss') as
    new_time,row_number() OVER(PARTITION BY id ORDER BY t.input_time DESC) as row_flg from table t where t.id in ('$id_clause') and t.mark='0') a where a.row_flg = '1'";
    
    $success_count = 0;
    
    try {
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $conn->beginTransaction();
    
        foreach ($conn->query($sql1, PDO::FETCH_ASSOC) as $res) {
            $id = $res['ID'];
            $name = $res['NAME'];
            $age = $res['AGE'];
            $mark = $res['MARK'];
    
            require '../pdo_connect_db.php'; // 链接MySQL数据库
            // 插入到MySQL
            $stmt = $pdo->prepare("INSERT INTO mytable (id,name,age,mark) VALUES (?, ?, ?, ?)");
            $stmt->execute([$id, $name, $age, $mark]);
    
            $success_count += $stmt->rowCount();
        }
    
        $response['success_count'] = $success_count;
    
        $conn->commit();
    } catch(PDOException $e) {
        $conn->rollBack();
        $failed[] = array('code' => 1, 'msg' => '发送失败');
    }
    
    $responseJson = json_encode($response);
    
    echo $responseJson;
    

    优化解决方案说明:

    1. 在连接Oracle数据库和连接MySQL数据库之前,将错误处理模式设置为抛出异常模式,以便能够捕获可能的错误。
    2. 使用事务包装循环插入操作,确保在插入过程中出现错误时能够回滚操作,保持数据一致性。
    3. 使用预处理语句(prepared statement)来插入数据,以防止SQL注入攻击,并提高性能。
    4. 使用rowCount方法获取每次插入操作影响的行数,并累加到$success_count变量中。
    5. 在循环结束后,将$success_count赋值给响应数据中的success_count字段。
    6. 在异常处理中,回滚事务,并设置$failed数组表示发送失败。

    这样优化后的代码可以确保数据库连接和查询的正确性,并通过成功插入的数据量来提供返回的响应数据中的success_count字段。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月16日
  • 已采纳回答 10月11日
  • 创建了问题 9月16日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题