通过JDBC运行SQL,如何参数化表名称

时间:2018-07-12 19:54:45

标签: oracle postgresql jdbc

如果我有两个表:

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 cretiria

但是在我的情况下,每个块实际上都是一个巨大的“ With ... Select ...”子句,而Java代码(旧版,我无法更改iota)实际上读取了每个sql通过JDBC执行该操作之前,请从.sql文件中进行以下阻止。

  • hugeQueryA.sql
  • hugeQueryB.sql

我的问题是:为避免重复此庞大的代码块,相反,构造单个大型存储过程(或函数)最好吗?

  • hugeStoredProc

将其放入我的数据库中,然后构造两个简单的sql

  • simpleQueryA.sql
  • simpleQueryB.sql

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

  • 是否可以在不使用动态SQL的情况下做到这一点(因为这样做,我假设我需要将原始巨大sql文件的内容更改为字符串并处理所有特殊字符-另外,那还会继续吗?看起来很糟糕?)?

  • 更一般地说,当我需要“参数化”表名并且不能使用“替代变量”时,动态SQL是唯一的方法吗?

1 个答案:

答案 0 :(得分:2)

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

例如,您可以更改:

from Test_Persons_A tp

收件人:

from {TableName} tp

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