oracle中怎么用存储过程的的方法 把一个用户里的一个表移到另一个用户里
3个回答
展开全部
一楼的回答不一定是提问者要的吧. 第一帖试着回答,不知掉百度问答好玩不好玩..
有几种方法可以做,一种是1楼回答的,建user,授权,然后imp/exp
针对于对你的问题的理解这是我的方法:
假设想从user A 移表C到user B.
此处楼主没有说清楚,是同一个instance里的俩个不同user,还是俩个不同instance里的不同user.
如果不同instance里的不同user,以下方法里用了db link的方法
1. 俩个user存在, 并且有相关权限,比如create session etc, 因为你有需要从一个user中去访问另个user,所以Grant select,insert等你需要的权限给另外个user,比如在user B里执行:
grant insert on C to A;
2. 在user B中建DB link使其能访问user A;
3. user B 中建立和user A你想移的那种表的表结构定义,此处俩个选择:
1). 手动建表,和moreazy做法一样, 在user B里执行create table C as select * from userA where rownum<1;
2). 把建表语句build in到你的存储过程中
4. 因为存储过程里用到了dblink所以动态sql可能会被用到.
以上是思路,以下是伪代码是最简单的类型,不考虑性能等等,至少简单逻辑,没时间测,顺手一写:
简单写的没有游标等等,如果考虑到大数据量,最好不要做一次性的insert select,用游标取出表数据然后loop的处理,适量的commit(比如1000-5000 commit)可大幅提高性能。
set serveroutput on;
DECLARE
v_dblink varchar2(128):='sss.com';
v_sql VARCHAR2(4000);
v_count NUMBER(10);
v_message VARCHAR2(4000);
BEGIN
-- check dblink
v_sql := 'select count(*) from all_db_links where db_link=upper('''||v_dblink||''')';
EXECUTE IMMEDIATE v_sql INTO v_count;
IF v_count = 0 THEN
v_message := 'db link '''||v_dblink||''' does not exist.';
DBMS_OUTPUT.PUT_LINE(v_message);
ELSE
v_sql := 'INSERT INTO C
(col1,col2)
SELECT col1,col2 FROM C'||v_dblink;
BEGIN
EXECUTE IMMEDIATE v_sql;
COMMIT;
EXCEPTION WHEN OTHERS THEN
v_message := SQLERRM(SQLCODE);
DBMS_OUTPUT.PUT_LINE(v_message);
END;
END IF;
END;
/
有几种方法可以做,一种是1楼回答的,建user,授权,然后imp/exp
针对于对你的问题的理解这是我的方法:
假设想从user A 移表C到user B.
此处楼主没有说清楚,是同一个instance里的俩个不同user,还是俩个不同instance里的不同user.
如果不同instance里的不同user,以下方法里用了db link的方法
1. 俩个user存在, 并且有相关权限,比如create session etc, 因为你有需要从一个user中去访问另个user,所以Grant select,insert等你需要的权限给另外个user,比如在user B里执行:
grant insert on C to A;
2. 在user B中建DB link使其能访问user A;
3. user B 中建立和user A你想移的那种表的表结构定义,此处俩个选择:
1). 手动建表,和moreazy做法一样, 在user B里执行create table C as select * from userA where rownum<1;
2). 把建表语句build in到你的存储过程中
4. 因为存储过程里用到了dblink所以动态sql可能会被用到.
以上是思路,以下是伪代码是最简单的类型,不考虑性能等等,至少简单逻辑,没时间测,顺手一写:
简单写的没有游标等等,如果考虑到大数据量,最好不要做一次性的insert select,用游标取出表数据然后loop的处理,适量的commit(比如1000-5000 commit)可大幅提高性能。
set serveroutput on;
DECLARE
v_dblink varchar2(128):='sss.com';
v_sql VARCHAR2(4000);
v_count NUMBER(10);
v_message VARCHAR2(4000);
BEGIN
-- check dblink
v_sql := 'select count(*) from all_db_links where db_link=upper('''||v_dblink||''')';
EXECUTE IMMEDIATE v_sql INTO v_count;
IF v_count = 0 THEN
v_message := 'db link '''||v_dblink||''' does not exist.';
DBMS_OUTPUT.PUT_LINE(v_message);
ELSE
v_sql := 'INSERT INTO C
(col1,col2)
SELECT col1,col2 FROM C'||v_dblink;
BEGIN
EXECUTE IMMEDIATE v_sql;
COMMIT;
EXCEPTION WHEN OTHERS THEN
v_message := SQLERRM(SQLCODE);
DBMS_OUTPUT.PUT_LINE(v_message);
END;
END IF;
END;
/
今至电子科技有限公司
2024-08-23 广告
2024-08-23 广告
上海今至电子科技有限公司,是一家从事运维服务、系统集成和网络工程的专业公司。业务涵盖IT解决方案、网络工程、应用软件开发、系统集成、服务器虚拟化、桌面虚拟化、高性能运算、负载均衡、数据容灾备份、服务外包、IT运维等。我们的理念:诚信为本,服...
点击进入详情页
本回答由今至电子科技有限公司提供
展开全部
1、exp->drop table->imp加fromuser、touser选项
2、重建->授权->数据插入新表。
connect user1/pwd1
grant select on table_name to user1
connect user2/pwd2
create table table_name as select * from user1.table_name
connect user1/paw1
drop table xxx
2、重建->授权->数据插入新表。
connect user1/pwd1
grant select on table_name to user1
connect user2/pwd2
create table table_name as select * from user1.table_name
connect user1/paw1
drop table xxx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以查一下DBLINK的用法,一个用户可以操作另一个用户的表,移过来更没问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询