问题如下:
1 有a,b,c,d,e5个表,用a表的某个字段如a_id与e表中的字段进行比较,将重复的a表记录插入B表,不重复的C表,B表有主键约束(b_id),在插入B表中的过程中如发生主键冲突,将A表的a_char字段与相应的B表的B_char字段合并,并将id和char字段信息插入B表,A表记录有2000万条,E表记录有3000万条。如何书写一个存储过程进行以上的处理?
2 有两个数据库A,B,A库字符集US7ASCII,B库ZHS16GBK,A库中存在汉字,如何从B库中通过DBLINK查询而不产生乱码?
我的作法如下:
一 建表并插入数据:
--create tables;
CREATE TABLE A
(
A_ID NUMBER(8),
A_CHAR CHAR(10 BYTE)
)
TABLESPACE USERS
CREATE TABLE B
(
B_ID NUMBER(8),
B_CHAR CHAR(10 BYTE)
)
TABLESPACE USERS;
ALTER TABLE SCOTT.B ADD
CONSTRAINT pk_b
PRIMARY KEY (B_ID);
CREATE TABLE C
(
C_ID NUMBER(8),
C_CHAR CHAR(10 BYTE)
)
TABLESPACE USERS;
CREATE TABLE D
(
D_ID NUMBER(8),
D_CHAR CHAR(20 BYTE)
)
TABLESPACE USERS;
CREATE TABLE E
(
E_ID NUMBER(8)
)
TABLESPACE USERS;
--insert records
--insert into table a
declare
l_cnt number:=0;
l_rows number := &1;
-- l_id number(8);
-- l_char char(10);
begin
execute immediate 'truncate table a';
while (l_cnt < l_rows) loop
execute immediate 'insert into a values (:1,:2)' using dbms_random.value(1,999) ,dbms_random.string('P',10);
l_cnt:=l_cnt+1;
end loop;
commit;
end;
/
--insert into table b
declare
l_cnt number:=0;
l_rows number := &1;
-- l_id number(8);
-- l_char char(10);
begin
execute immediate 'truncate table b';
while (l_cnt < l_rows) loop
execute immediate 'insert into b values (:1,:2)' using l_cnt ,dbms_random.string('P',10);
l_cnt:=l_cnt+1;
end loop;
commit;
end;
/
--insert into table e
declare
l_cnt number:=0;
l_rows number := &1;
-- l_id number(8);
-- l_char char(10);
begin
execute immediate 'truncate table e';
while (l_cnt < l_rows) loop
execute immediate 'insert into e values (:1)' using dbms_random.value(1,999);
l_cnt:=l_cnt+1;
end loop;
commit;
end;
/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9375/viewspace-555075/
,如需转载,请注明出处,否则将追究法律责任。