/**
* 删除当前数据库中,所有表中传入的字段名,以及对应标记值的记录
* Mr_Chenph(2012-1-12)
* 调用方式 select DeleteTag('isdel', 1) from dual
* 以上语句将删除所有表中isdel字段值为1的记录
**/
CREATE OR REPLACE FUNCTION DeleteTag(v_col IN VARCHAR2, del_tag IN NUMBER) RETURN VARCHAR2 IS
-- 当前function用到的变量
v_expense VARCHAR2(200);
v_tableName VARCHAR2(100);
v_tableNameCol VARCHAR2(100);
-- 获取当前数据库中的所有表
CURSOR TABLE_LOOP IS SELECT Table_name FROM User_tables;
-- 获取某表中得所有字段
CURSOR COL_LOOP(v_tableName varchar2) is SELECT column_name FROM user_tab_columns t WHERE
t.TABLE_NAME=v_tableName;
-- 事务
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
-- 设置返回值 0正常 其他为异常
v_expense := '0';
-- 打开第一个游标
OPEN TABLE_LOOP;
LOOP
FETCH TABLE_LOOP INTO v_tableName;
EXIT WHEN TABLE_LOOP %NOTFOUND;
-- 打开第二个游标
OPEN COL_LOOP(v_tableName);
LOOP
FETCH COL_LOOP INTO v_tableNameCol;
EXIT WHEN COL_LOOP %NOTFOUND;
-- 判断字段名是否一致
IF(v_tableNameCol = UPPER(v_col)) THEN
EXECUTE IMMEDIATE 'delete from '||v_tableName||' where '||v_col||'='||del_tag;
END IF;
END LOOP;
CLOSE COL_LOOP;
END LOOP;
CLOSE TABLE_LOOP;
-- 提交事务
COMMIT;
-- 异常处理
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
v_expense := SQLCODE||'---'||SQLERRM;
-- 返回结果
RETURN v_expense;
END DeleteTag;
Oracle的Function,删除所有表中某字段为特定值的记录
最新推荐文章于 2022-08-31 11:22:14 发布
