首页 > 解决方案 > 通过 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%'

您可以看到唯一的区别是:

但就我而言,每个块实际上都是一个巨大的“With...Select...”子句,而 Java 代码(旧版,我无法更改 iota)实际上从一个.sql 文件如下,然后通过 JDBC 执行它。

我的问题是:为了避免重复这个巨大的代码块,最好构造一个大型存储过程(或函数)吗?

放到我的数据库里,然后构造两个简单的sql

调用带有参数的存储过程(在每个sql中指定)?

标签: oraclepostgresqljdbc

解决方案


表名无法参数化,但您可以在加载 .sql 文件后使用字符串替换来生成所需的 SQL,前提是您要替换的表名不是基于用户输入。

例如,您可以更改:

from Test_Persons_A tp

至:

from {TableName} tp

加载文件后,使用字符串替换将“{TableName}”替换为实际的表名,然后执行。


推荐阅读