java - 准备好的语句中的占位符
问题描述
我在准备好的语句中使用以下查询。早些时候我在过程中使用并使用可调用但现在我试图在 jdbc 准备语句中使用选择查询。
我知道我们在preparestatement中写insert into abc values(?,?,?);
但在这里我有插入选择。许多地方都使用了相同的变量。在这个查询中,我有 2 个变量
p_entity_type
和p_update_mode
INSERT INTO dynamicEntitynotgett
(entity_type, entity_id, entity_code, synonyms, action)
WITH data_view AS
( -- ITEM table
SELECT 'ITEM' entity_type, -- This separates inserted values
item_id data_id,
item_name data_name,
item_desc data_desc,
creation_date
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc,
creation_date
FROM orgde
UNION ALL
-- Feature table
SELECT 'FEATURES' entity_type, -- This separates inserted values
FEATURE_id data_id,
FEATURE_NAME data_name,
FEATURE_DESC data_desc,
CREATION_DATE
FROM FEATURESDE
)
SELECT upper(t.entity_type),
t.data_id,
t.data_name,
t.data_desc,
CASE lower(p_update_mode)
WHEN 'INCREMENTAL' THEN
CASE
WHEN t.creation_date > b.last_update_date THEN
'update'
WHEN t.creation_date < b.last_update_date THEN
'add'
END
WHEN 'full' THEN
'add'
END action
FROM data_view t
LEFT JOIN ODA_REFRESH_DETAILS b
ON b.entity_type = t.entity_type
AND lower(p_update_mode )='incremental'
WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
AND (lower(p_update_mode) = 'full'
OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
);
我将从上游接收 p_entity_type 和 p_update_mode。哪种解决方案会更好?结果集或 Preparedstatement 以及如何在查询中替换这些值或使用 setXXX()。
解决方案
我想你正在寻找namedParameterStatement
. 这将允许您命名参数。
我不确定您在声明中指的是什么,但例如,这一行:
SELECT 'ITEM' entity_type
可以替换为:
SELECT :ITEM as entity_type
where:ITEM
就像 a 一样传入?
,但可以在语句中多次使用。
推荐阅读
- java - 为什么客户端在向服务器发送对象时冻结?
- c++ - 关于创建我自己的模板化函数进行排序的问题
- reactjs - TypeError:无法添加属性数量,对象不可扩展
- php - 根据浏览器和视口自动提供最佳图像
- json - 如何快速将 JSON 数据写入/保存到 Xcode 中的 .json 文件中?
- flutter - Flutter:如何修复“多个小部件使用相同的 GlobalKey”错误
- python - 根据python脚本中的新值替换常量值并更新其他值
- amazon-web-services - CloudFormation 从 API Gateway 发回 Lambda 响应
- r - modelsummary 的 modelplot() 图中的 UTF-8 和 unicode
- linux - Hangfire 作业应该在中午 12 点到晚上 9 点之间每小时运行一次