gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:31:22 25 4
gpt4 key购买 nike

如果我有两个表:

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代码中执行以下两个查询

block A:

select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_A tp
where tp.LASTNAME like '%1%'

B block :

select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_B tp
where tp.LASTNAME like '%2%'

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

  • 表名
  • LASTNAME cretiria

但在我的例子中,每个 block 实际上都是一个巨大的“With...Select...”子句,而 java 代码(遗留的,我无法更改 iota)实际上读取每个 sql在通过 JDBC 执行之前从 .sql 文件中阻止,如下所示。

  • hugeQueryA.sql
  • hugeQueryB.sql

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

  • 巨大的存储过程

放在我的DB里,然后构造两个简单的sql

  • simpleQueryA.sql
  • 简单查询B.sql

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

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

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

最佳答案

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

例如,您可以更改:

from Test_Persons_A tp

到:

from {TableName} tp

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

关于oracle - 通过 JDBC 运行 SQL,如何参数化表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51313477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com