gpt4 book ai didi

java - 使用 Prepared Statement 设置 LONG 数据类型

转载 作者:行者123 更新时间:2023-11-29 08:10:25 27 4
gpt4 key购买 nike

我的情况是我需要在特定时间即时创建数据库分区。我正在使用如下所示的 Statement:

alter table table_name split partition default_partition values (' +
id + ') into ( partition " + partitionName + ", partition
default_partition) update indexes

这工作正常并且完全符合我的预期。但是,id 的值来自未经授权的人可能访问的输入。因此,上述语句容易受到 SQL 注入(inject)攻击。我想使用 PreparedStatement,但我不知道如何使用。

问题是 oracle 中的分区表将“id”值放入 LONG 的 HIGH_VALUE 列中。我看不到合适的 setter 来执行此操作(因为 String 无法工作)。我试过使用各种流消息,将 StringReaderByteArrayInputStream 作为值都没有用。我知道不应该再使用 LONG,但这就是 Oracle 的方式,所以我真的无法绕过它。

当我尝试使用这些方法中的任何一种时,这就是我得到的:

ORA-14308: partition bound element must be one of: string, datetime or interval literal, number, or NULL

Oracle 文档有关于如何获取 LONG(oracle 数据类型,类似于 LOB)但没有如何设置它的详细信息。谁能帮我解决这个问题?我还研究了 JDBC 驱动程序的 Oracle 实现,但它似乎也没有 setLONG 类型的方法。我有办法做到这一点吗?

最佳答案

您不能将绑定(bind)变量与 DDL 一起使用。您将无法使用 PreparedStatement 并在 DDL 语句中调用任何 setXXXX 方法。

至少,根据用户输入动态拆分分区是一种非常不寻常的设计。我倾向于怀疑你会得到更好的服务,比如 interval partitioning Oracle 负责在需要时创建新分区或散列分区而不是范围分区。假设实时手动创建新分区确实有意义,但是,您必须编写代码来验证“id”和“partitionName”值是否有效,以防止 SQL 注入(inject)。

关于java - 使用 Prepared Statement 设置 LONG 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com