oracle - 通过 JDBC 运行 SQL,如何参数化表名
问题描述
如果我有两张桌子:
CREATE TABLE Test_Persons_A
(
PersonID int,
LastName varchar(255),
FirstName varchar(255)
);
INSERT INTO Test_Persons_A (PersonID, LastName, FirstName)
VALUES (11, 'LN_A1', 'FN_A1');
INSERT INTO Test_Persons_A (PersonID, LastName, FirstName)
VALUES (12, 'LN_A2', 'FN_A2');
CREATE TABLE Test_Persons_B
(
PersonID int,
LastName varchar(255),
FirstName varchar(255)
);
INSERT INTO Test_Persons_B (PersonID, LastName, FirstName)
VALUES (21, 'LN_B1', 'FN_B1');
INSERT INTO Test_Persons_B (PersonID, LastName, FirstName)
VALUES (22, 'LN_B2', 'FN_B2');
commit;
我想要达到的效果相当于通过JDBC(oracle)从java代码执行以下两个查询
A座:
select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_A tp
where tp.LASTNAME like '%1%'
B座:
select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_B tp
where tp.LASTNAME like '%2%'
您可以看到唯一的区别是:
- 表名
- LASTNAME 条件
但就我而言,每个块实际上都是一个巨大的“With...Select...”子句,而 Java 代码(旧版,我无法更改 iota)实际上从一个.sql 文件如下,然后通过 JDBC 执行它。
- 巨大的QueryA.sql
- 巨大的查询B.sql
我的问题是:为了避免重复这个巨大的代码块,最好构造一个大型存储过程(或函数)吗?
- 巨大的存储过程
放到我的数据库里,然后构造两个简单的sql
- 简单查询A.sql
- 简单查询B.sql
调用带有参数的存储过程(在每个sql中指定)?
我可以在不必使用动态 SQL 的情况下执行此操作吗(因为这样做我假设我需要将原始巨大 sql 文件的内容更改为字符串并处理所有特殊字符 - 另外,这也会看起来很糟糕吗?)?
更一般地说,当我需要“参数化”表名并且不能使用“替换变量”时,动态 SQL 是唯一的方法吗?
解决方案
表名无法参数化,但您可以在加载 .sql 文件后使用字符串替换来生成所需的 SQL,前提是您要替换的表名不是基于用户输入。
例如,您可以更改:
from Test_Persons_A tp
至:
from {TableName} tp
加载文件后,使用字符串替换将“{TableName}”替换为实际的表名,然后执行。
推荐阅读
- javascript - 替换画布上的颜色
- javascript - 在 Bootstrap 按钮中调用 Javascript 函数
- php - WordPress 发布评级显示位置更改
- java - 网页抓取 Java
- java - 使用 RealmRecyclerViewAdapter 和拖放的移动动画
- python - 为什么 tkinter-buttons 全部禁用?
- r - 是否可以在 R 中可视化具有大量特征(> 50)的数据
- ios - 为 UIView 设置动画时自动调整 CAShapeLayer 的大小
- android - 奥利奥后台服务问题
- apache-camel - Activiti 进程中的双倍任务