Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL-在新表中保留来自上一个表的注释_Sql_Oracle - Fatal编程技术网

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链接后面的那些