Oracle SQL-在新表中保留来自上一个表的注释
编辑:谢谢,我又向前走了一步,但由于原始表是通过数据库链接访问的,所以似乎无法使其工作 我有很多表,在注释部分有列的描述 除了在创建新表之后手动添加注释外,还有什么方法可以在创建新表时复制注释Oracle SQL-在新表中保留来自上一个表的注释,sql,oracle,Sql,Oracle,编辑:谢谢,我又向前走了一步,但由于原始表是通过数据库链接访问的,所以似乎无法使其工作 我有很多表,在注释部分有列的描述 除了在创建新表之后手动添加注释外,还有什么方法可以在创建新表时复制注释 Select a.tot_sum ,b.id ,b.size from original_table a ,someother_table b where a.id=b.id and b.region in 'North' 我可以在excel中手动进行一些复制粘贴
Select a.tot_sum
,b.id
,b.size
from original_table a
,someother_table b
where a.id=b.id
and b.region in 'North'
我可以在excel中手动进行一些复制粘贴:
Comment On Column Mytable.Tot_Sum
Is 'Total sum of sales';
但我想这样做:
Comment On Column Mytable.Tot_Sum
IS (select comment from column original_table.tot_sum);
或者,在创建新表时,是否有一种语法可以简单地保留注释?您可以查询所有的注释 您可以使用一个小的PL/SQL匿名块自动执行此操作:
SQL> set serveroutput on;
SQL> DECLARE
2 v_ViewName VARCHAR2(30) := 'XXX';
3 BEGIN
4 FOR v_Comment IN
5 (SELECT acc.COLUMN_NAME,
6 REPLACE(REPLACE(acc.COMMENTS, chr(13), ''), chr(10), '') comments
7 FROM ALL_COL_COMMENTS ACC
8 WHERE ACC.OWNER = 'SCOTT'
9 AND ACC.TABLE_NAME = 'EMP'
10 )
11 LOOP
12 dbms_output.put_line(v_comment.column_name || ' - '||v_comment.comments);
13 END LOOP;
14 END;
15 /
EMPNO -
ENAME -
JOB -
MGR -
HIREDATE -
SAL -
COMM -
DEPTNO -
PL/SQL procedure successfully completed.
如果您有任何带有注释的表,只需在我的脚本中替换用户名和表名即可
declare
comment_ varchar2(255);
begin
select comments into comment_ from user_col_comments
where table_name=upper('original_table')
and column_name=upper('my_column');
execute immediate 'comment on column new_table.my_column is '''||comment_||'''';
end;
COMMENT函数只接受文本文本,这就是为什么我使用动态查询而不是IS SELECT,因为这里有用于注释的DBA视图 DBA_COL_评论 所有的意见 用户意见 你可以这样做:
declare
v_comment varchar2(100);
v_stmt varchar2(4000);
begin
select comments
into v_comment
from user_col_comments
where table_name= 'ORIGINAL_TABLE'
and column_name='TOT_SUM';
v_stmt:='comment on column MYTABLE.TOT_SUM IS '''||v_comment||'''';
execute immediate v_stmt;
end;
编辑:当您有很多列时,您可以通过执行以下操作使其自动化:
declare
v_comment varchar2(100);
v_stmt varchar2(4000);
v_orig_table varchar2(100) :='ORIGINAL_TABLE';
v_new_table varchar2(100) :='MYTABLE';
begin
for c in (select column_name
from user_tab_columns c
where table_name=v_orig_table
and exists(select 1
from user_tab_columns
where table_name=v_new_table
and column_name=c.column_name)) loop
select comments
into v_comment
from user_col_comments
where table_name= v_orig_table
and column_name=c.column_name;
v_stmt:='comment on column '||v_new_table||'.'||c.column_name||' IS '''||v_comment||'''';
execute immediate v_stmt;
end loop;
end;
编辑2:具有模式名称和DB链接的版本
declare
v_comment varchar2(100);
v_stmt varchar2(4000);
v_orig_table varchar2(100) :='ORIGINAL_TABLE';
v_orig_schema varchar2(100) := 'ORIG_OWNER';
v_new_table varchar2(100) :='MYTABLE';
begin
for c in (select column_name
from all_tab_columns@db.link c
where table_name=v_orig_table
and owner=v_orig_schema
and exists(select 1
from user_tab_columns
where table_name=v_new_table
and column_name=c.column_name)) loop
select comments
into v_comment
from all_col_comments@db.link
where table_name= v_orig_table
and column_name=c.column_name
and owner=v_orig_schema;
v_stmt:='comment on column '||v_new_table||'.'||c.column_name||' IS '''||v_comment||'''';
execute immediate v_stmt;
end loop;
end;
我几乎可以让这个工作,但似乎我的数据库链接是造成问题。我的语句不是“原始表”,而是“schema\u name.ORIGINAL”_table@dblin.something'您必须将db链接添加到用户注释。不要把模式名写进我的变量中,只写表名,你必须用大写字母写。谢谢!又近了一步,但我还是不能让它工作。我得到的错误是在第16行没有找到数据。但是,如果我将原始所有者更改为原始所有者。标点符号添加了循环运行,但没有向列添加任何内容。ORIG_OWNER是架构名称,请尝试在没有PL/SQL的情况下运行select语句进行调试。无法将块select注释从user_col_注释中获取到v_注释,其中table_name=v_ORIG_table,column_name=c.column_名称;跑。似乎我只找到我自己的专栏和评论,而不是db链接后面的那些