--执行方法:把当前用户中所有'p_tab%'的表的p_col字段全部更新为'p_value'
--在command window中输入:execute pro_update('p_tab','p_col','p_value');
--参数说明:p_tab:匹配表的表名前几位,要大写
--参数说明:p_col:匹配字段,要大写
--参数说明:p_value:修改字段的值
--限制说明:只能更新字符型字段。
--请注明作者:liqinglin
create or replace procedure pro_update
(
p_tab in varchar2,
p_col in varchar2,
p_value in varchar2
)
is
v_cursor NUMBER;
v_stat NUMBER;
v_str1 varchar2(100);
v_str2 varchar2(100);
v_sql varchar2(200);
v_up varchar2(200);
begin
v_sql := 'select TABLE_NAME,COLUMN_NAME from user_tab_columns where TABLE_NAME like '''||p_tab||'%'''||' AND COLUMN_NAME='||''''||p_col||'''';
v_cursor := dbms_sql.open_cursor; --打开游标;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析动态SQL语句;
-- dbms_sql.bind_variable(v_cursor, ':p_tab', '%'||p_tab||'%'); --绑定输入参数;
--dbms_sql.bind_variable(v_cursor, ':p_col', p_col); --绑定输入参数;
dbms_sql.define_column(v_cursor, 1, v_str1,128); --定义列
dbms_sql.define_column(v_cursor, 2, v_str2,128); --定义列
v_stat := dbms_sql.execute(v_cursor); --执行动态SQL语句
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_str1); --将当前行的查询结果写入上面定义的列中。
dbms_sql.column_value(v_cursor, 2, v_str2);
--处理表
v_up:=' UPDATE ' ||v_str1|| ' SET ' ||v_str2|| '='''||p_value||'''';
execute immediate (v_up);
COMMIT;
END LOOP;
dbms_sql.close_cursor(v_cursor); --关闭游标。
end pro_update;