使用Prepared Statement设置LONG数据类型

AHu*_*ist 1 java oracle jdbc prepared-statement database-partitioning

我的情况是我需要在特定时间动态创建数据库分区.我使用Statement的如下:

alter table table_name split partition default_partition values (' +
id + ') into (  partition " + partitionName + ", partition
default_partition) update indexes
Run Code Online (Sandbox Code Playgroud)

这很好,完全符合我的预期.但是,价值id来自未经授权的人可能访问的输入.因此,上述语句容易受到SQL注入攻击.我想用一个PreparedStatement,但我无法弄清楚如何.

问题是oracle中的分区表将" id"值放入HIGH_VALUE列中,该列为LONG.我认为没有合适的setter来执行此操作(因为String无法工作).我已经尝试过使用各种流消息,a StringReaderByteArrayInputStream值都没有用.我知道LONGs不应再被使用了,但这就是Oracle拥有它的方式所以我无法真正解决它.

当我尝试任何一种方式时,这就是我得到的:

ORA-14308: partition bound element must be one of: string, datetime or interval literal, number, or NULL
Run Code Online (Sandbox Code Playgroud)

Oracle doc有关于如何获取LONG(oracle数据类型,类似于LOB)但不知道如何设置它的良好信息.任何人都可以帮我这个吗?我也研究了JDBC驱动程序的Oracle实现,但它似乎也没有setLONG类型方法.有没有办法可以做到这一点?

Jus*_*ave 5

您不能将绑定变量与DDL一起使用.您将无法在DDL语句中使用PreparedStatement和调用任何setXXXX方法.

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