oracle 导sqlserver 主键不会自动导过去 我采用以下方式查询所有的主键及联合主键,拼成sql串,拿语句到sqlserver里执行。
可能方式有些笨拙,先这样啦,第一次用游标,感觉应该可以用一个游标的,但是试了半天没有试出来,就把单独的主键和联合主键分开了。 主键:au.constraint_type = 'P' 外键:au.constraint_type = 'F'
游标在pl/sql里执行看不到结果,需要用sql*plus 登录sql*plus conn 用户名/密码@orcl 设置显示结果 set serveroutput on; 然后执行如下两个游标,拷出结果,就是系统里所有的主键
单个的主键 declare --类型定义 cursor CURSOR1 isselect a.column_name,b.* from user_cons_columns a , (select cu.TABLE_NAME, au.constraint_type, CU.CONSTRAINT_NAME ,--cu.column_name , cu.owner, COUNT(cu.TABLE_NAME) from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and cu.owner = 'GABSYSTEM' -- and cu.table_name = 'SYSUSERDEPARTPOWER' and cu.table_name notlike'BIN%'HAVINGCOUNT(CU.column_name) < 2 groupby cu.TABLE_NAME, au.constraint_type, CU.CONSTRAINT_NAME, cu.owner-- ,cu.column_name ORDERBY CU.table_name) b where a.table_name=b.table_name and a.owner = b.owner and a.constraint_name = b.constraint_name; --定义一个游标变量 ccrec CURSOR1%rowtype; begin --for循环 OPEN CURSOR1; LOOP FETCH CURSOR1 INTO ccrec; EXITWHEN CURSOR1%NOTFOUND; dbms_output.put_line('ALTER TABLE '||ccrec.TABLE_NAME||' ADD CONSTRAINT '||ccrec.constraint_NAME ||' PRIMARY KEY ('||CCREC.column_name||');'); endloop; CLOSE CURSOR1; END;
复合主键的表
declare --类型定义 cursor cursor1 isselect cu.TABLE_NAME, au.constraint_type, CU.CONSTRAINT_NAME,cu.owner,COUNT(cu.TABLE_NAME) from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and cu.owner = 'GABSYSTEM' and cu.table_name notlike'BIN%' HAVINGCOUNT(cu.TABLE_NAME) >2 groupby cu.TABLE_NAME,au.constraint_type,CU.CONSTRAINT_NAME,cu.owner ORDERBY CU.table_name;
cursor cursor2 (tablename varchar2) is select CU.CONSTRAINT_NAME,cu.COLUMN_NAME,cu.TABLE_NAME, au.constraint_type, cu.owner fromuser_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and cu.owner = 'GABSYSTEM' and cu.table_name=tablename ORDERBY CU.table_name; --定义一个游标变量 ccrec cursor1%rowtype; cctablename varchar2(200); ddrec cursor2%rowtype; allcolumn varchar2(1000); begin --for循环 OPEN cursor1; LOOP FETCH cursor1 INTO ccrec; EXITWHEN cursor1%NOTFOUND; -- dbms_output.put_line('cursor1--'||ccrec.TABLE_NAME||'-'||ccrec.constraint_type||'-'||ccrec.CONSTRAINT_NAME); cctablename:=ccrec.TABLE_NAME; allcolumn:=null; OPEN cursor2(ccrec.TABLE_NAME); LOOP FETCH cursor2 INTO ddrec; EXITWHEN cursor2%NOTFOUND; --dbms_output.put_line('cursor2--'||ddrec.TABLE_NAME||'-'||ddrec.COLUMN_NAME||'-'||ddrec.constraint_type||'-'||ddrec.CONSTRAINT_NAME); allcolumn:=allcolumn||','||ddrec.COLUMN_NAME; ENDLOOP; dbms_output.put_line('ALTER TABLE '||ddrec.TABLE_NAME||' ADD CONSTRAINT '|| ccrec.CONSTRAINT_NAME ||' PRIMARY KEY ('||substr(allcolumn,2,length(allcolumn)-1)||');'); CLOSE cursor2; ENDLOOP; CLOSE cursor1; END;
|