ITPub博客

首页 > 数据库 > 国内数据库 > 【YashanDB 知识库】共享超过 32000 字节字符串插入 CLOB 类型方案

【YashanDB 知识库】共享超过 32000 字节字符串插入 CLOB 类型方案

原创 国内数据库 作者:崖山数据库系统YashanDB 时间:2025-02-11 15:03:50 0 删除 编辑

public static void insertSql(DataSource dataSource, String sql) {

log.info("insertSql sql = {}", sql);

// 获取数据库连接

Connection connection = getConnection(dataSource);

PreparedStatement ps = null;

// 通过 sql 获取 SQLStatement

SQLStatement stmt = InsertSqlParserUtil.getInsertStmt(sql);

// 通过 SQLStatement 动态获取 insert into xxx values (?,?,?......) 插入语句

String insertSQL = InsertSqlParserUtil.getInsertSQL(stmt);

try {

// 通过 insertSQL 获取 PreparedStatement 对象

ps = connection.prepareStatement(insertSQL);

// 动态绑定插入变量

InsertSqlParserUtil.bindPreparedStatement(stmt, ps);

// 执行插入

ps.execute();

} catch (SQLException e) {

log.error ("insert 异常", e);

} finally {

closePreparedStatement(ps);

closeConnection(connection);

}

}

public static SQLStatement getInsertStmt(String sql) {

SQLStatement stmt = null;

DbType druidDbType = DbType.oracle;

String formatSQL = SQLUtils.format(sql, druidDbType);

List<SQLStatement> stmtList = new ArrayList<>();

try {

stmtList = SQLUtils.parseStatements(formatSQL, druidDbType);

} catch (Exception exp) {

log.error("parseStatements sql is :{}", formatSQL);

log.error("parseStatements exception : {}", exp.getMessage());

}

log.info("getInsertValues param stmtList size is {}", stmtList.size());

stmt = stmtList.get(0);

SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(druidDbType);

stmt.accept(statVisitor);

log.info(SQLUtils.toSQLString(stmt));

if (stmt instanceof OracleInsertStatement) {

return stmt;

}

return stmt;

}

public static String getInsertSQL(SQLStatement stmt) {

StringBuilder sb = new StringBuilder();

String schemaName = null;

String tableName = null;

if (stmt instanceof OracleInsertStatement) {

schemaName = ((OracleInsertStatement) stmt).getTableSource().getSchema();

tableName = ((OracleInsertStatement) stmt).getTableSource().getTableName();

if (StringUtils.isEmpty(tableName)) {

return sb.toString();

} else if (!StringUtils.isEmpty(schemaName)) {

tableName = schemaName + "." + tableName;

}

if (!StringUtils.isEmpty(tableName)) {

sb.append("INSERT INTO ").append(tableName.toUpperCase()).append(" VALUES(");

}

List<SQLExpr> values = ((OracleInsertStatement) stmt).getValuesList().get(0).getValues();

for (int i = 0; i < values.size(); i++) {

if (i == values.size() - 1) {

sb.append("?");

} else {

sb.append("?,");

}

}

sb.append(")");

}

return sb.toString();

}

public static void bindPreparedStatement(SQLStatement stmt, PreparedStatement pst) {

List<SQLExpr> values = ((OracleInsertStatement) stmt).getValuesList().get(0).getValues();

for (int i = 0; i < values.size(); i++) {

SQLExpr value = values.get(i);

try {

if (value instanceof SQLIntegerExpr) {

pst.setInt(i + 1, ((SQLIntegerExpr) value).getNumber().intValue());

} else if (value instanceof SQLBigIntExpr) {

pst.setLong(i + 1, ((SQLBigIntExpr) value).getNumber().intValue());

} else if (value instanceof SQLNumberExpr) {

Number number = ((SQLNumberExpr) value).getNumber();

if (number instanceof BigDecimal) {

pst.setBigDecimal(i + 1, (BigDecimal) number);

}

} else if (value instanceof SQLCharExpr) {

pst.setString(i + 1, ((SQLCharExpr) value).getText());

} else if (value instanceof SQLTimestampExpr) {

pst.setTimestamp(i + 1, Timestamp.valueOf(((SQLTimestampExpr) value).getValue()));

} else if (value instanceof SQLDateExpr) {

pst.setDate(i + 1, Date.valueOf(((SQLDateExpr) value).getValue()));

} else if (value instanceof SQLDateTimeExpr) {

pst.setDate(i + 1, Date.valueOf(((SQLDateTimeExpr) value).getValue()));

} else if (value instanceof SQLNullExpr) {

pst.setNull(i + 1, Types.NULL);

} else {

pst.setString(i + 1, ((SQLCharExpr) value).getText());

}

} catch (SQLException e) {

log.error ("绑定插入变量异常", e);

}

}

}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3071685/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据管理解决方案。

注册时间:2023-04-11

  • 博文量
    722
  • 访问量
    640225