如果我有两个表:
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
调用带有参数的存储过程(在每个sql中指定)?
是否可以在不使用动态SQL的情况下做到这一点(因为这样做,我假设我需要将原始巨大sql文件的内容更改为字符串并处理所有特殊字符-另外,那还会继续吗?看起来很糟糕?)?
更一般地说,当我需要“参数化”表名并且不能使用“替代变量”时,动态SQL是唯一的方法吗?
答案 0 :(得分:2)
无法对表名进行参数化,但是如果要替换的表名不是基于用户输入的,则可以在加载.sql文件后使用字符串替换生成所需的SQL。
例如,您可以更改:
from Test_Persons_A tp
收件人:
from {TableName} tp
加载文件后,使用字符串替换将“ {TableName}”替换为实际的表名,然后执行。