我访问了很多表,其中包含评论部分中列的说明。
除了手动添加后,还有什么办法可以在创建新表时复制注释吗?
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);
或者是否有一种语法可以在创建新表时简单地保留注释?
答案 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;