问题描述
我在准备好的语句中使用以下查询。之前我在过程中使用了可调用的方法,但现在我试图在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
其中:ITEM
的传递就像?
一样,但是可以在语句中多次使用。