sql存储过程的应用

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)
	   		)

完美解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值