在sql中我们经常 用 where field='XXXX' 来判断获取特定数据。
在一次项目中遇到了个比较奇怪的问题,需要根据值来反向检索字段,即是否有字段存在特定的值。想来想去好像没办法用一个sql实现于是写了个存储过程简单实现。
其实可以写得很强大,但就是懒---能实现功能就好。代码如下。
-- 反向判断:判断指定表是否有存在 特定值的字段(该表主键写死掉punid,哈哈业务是这样有需要可以改成动态的)
CREATE OR REPLACE PROCEDURE "P_FINDCOLUMNSBYVALUE"
(
retVal out integer, --返回是否存在 1存在,0不存在
unid in varchar2, --主键
inTableName in varchar2, --表名
inValue in varchar2 --值
)
as
tmp_columns varchar2(100); --表的字段名
IS_EXIST NUMBER; --数据是否存在
tmp_sql char(150);
begin
retVal := 0;
declare cursor c_tmp is SELECT t.COLUMN_NAME FROM user_tab_columns t WHERE t.TABLE_NAME= inTableName and t.DATA_TYPE='VARCHAR2';
begin
open c_tmp;
loop
fetch c_tmp into tmp_columns;
tmp_sql := 'select count(*) from '||inTableName||' where '||tmp_columns||' = '''||inValue||''' and punid = '''||unid||'''';
DBMS_OUTPUT.PUT_LINE(tmp_sql);
execute immediate tmp_sql into IS_EXIST;
DBMS_OUTPUT.PUT_LINE(IS_EXIST);
IF (IS_EXIST != 0) THEN
retVal := 1;
exit;
end if;
exit when c_tmp%NOTFOUND;
end loop;
close c_tmp; --关闭游标
end;
end;