sql存储过程的应用
问题来源:
这周的一个需求,需要对一个分页进行数据筛选,来看下为什么我会选择使用sql存储过程来实现这个需求。
我们看一下表结构
select
...
t.data_def_uuid as data_def_uuid,
...
from ...
where ...
t.data_def_uuid是我需要数据筛选必要的数据,他表示的意思是通过此id,可以查询到表名
步骤一:
select table_name
from dyform_form_definition
where UUID=t.data_def_uuid
而获取的这个表名,我需要判断其表是否存在字段process_handler_person,
这个项目用的是达梦数据库,他的做法是
步骤二:
select 1
from USER_TAB_COLUMNS
where COLUMN_NAME = 'process_handler_person'
and TABLE_NAME = table_name -- 这里的table_name是第一个步骤获取的
当且仅当这个表存在此字段时,他可以返回1来表示有数据,否则不返回
而如果判断这个表有这个字段,那么难点来了,我们需要用步骤一获取的表,查询字段process_handler_person,从外面传进来一个参数与此字段保存的值进行like判断,如果通过,则当前分页的当前行可以被返回,否则不予返回,我们目前无法使用
select * from (select table_name from dyform_form_definition …)
的方式进行查询,但又不能转移到java进行处理,所以我需要用到sql的存储过程,代码如下:
CREATE OR REPLACE FUNCTION GetProcessHandlerPerson(
data_def_uuid IN VARCHAR,
currUserId IN VARCHAR,
dataId IN VARCHAR
) RETURN INTEGER AS
tableName VARCHAR(255);
processHandler int;
v_sql VARCHAR(1000);
result INTEGER;
BEGIN
SELECT count(t2.table_name),t2.table_name INTO processHandler,tableName
FROM USER_TAB_COLUMNS t1
INNER JOIN dyform_form_definition t2 on t1.TABLE_NAME = t2.TABLE_NAME
WHERE t1.COLUMN_NAME = 'process_handler_person'
AND t2.UUID= data_def_uuid
group by t2.table_name;
IF processHandler = 1 THEN
v_sql = 'SELECT 1 FROM ' || tableName || ' WHERE process_handler_person LIKE ''%' || currUserId || '%'' AND UUID = ''' || dataId || '''';
EXECUTE IMMEDIATE v_sql INTO result;
END IF;
return result;
EXCEPTION
WHEN NO_DATA_FOUND THEN
IF processHandler IS NULL AND tableName IS NULL THEN
RETURN 1;
ELSE
RETURN null;
END IF;
END;
/
不细说里面的构成,只是提供一种解决思路,执行后我们可以在
看到,回到项目
select
...
t.data_def_uuid as data_def_uuid,
...
from ...
where ...
--使用新增的函数,函数执行存储过程对其进行判断与校验
and exists (
select GetProcessHandlerPerson(t.data_def_uuid,:currentUserId,t.data_uuid)
)
完美解决