先从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));

?>

【以下回答由 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字段。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^