Oracle SQL - 保留新表中上一个表的注释

时间:2014-09-12 09:13:57

标签: 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中使用一些copypasting手动完成:

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);

或者是否有一种语法可以在创建新表时简单地保留注释?

3 个答案:

答案 0 :(得分:0)

您可以查询ALL_COL_COMMNENTS。

您可以使用小型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.

如果您有任何包含注释的表,请在我的脚本中替换USER和TABLE_NAME。

答案 1 :(得分:0)

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

的原因

答案 2 :(得分:0)

评论中有DBA-Views。

DBA_COL_COMMENTS ALL_COL_COMMENTS USER_COL_COMMENTS

你可以这样做:

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:带有SCHEMA_Name和DB-Link的版本

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;