plsql比较表和视图

时间:2014-11-26 11:51:13

标签: oracle

我需要比较表和视图之间的列,我选择查看是否有匹配的列。(在PLSQL中) 不匹配的列需要输出为:table1中缺少view1中的column1等。 到目前为止,我已经做了,但它给了我一个错误:

DECLARE
CURSOR c_col
IS
SELECT T.TABLE_NAME,
T.COLUMN_NAME,
V.TABLE_NAME,
V.COLUMN_NAME
FROM ALL_TAB_COLUMNS T
FULL JOIN ALL_TAB_COLUMNS V
ON T.column_name=V.column_NAME
AND v.table_name='EMP_V'
AND v.owner     ='HR'
WHERE T. OWNER  ='HR'
and T.TABLE_NAME='EMPLOYEES';
v_table c_col%rowtype;
begin
OPEN C_col;
LOOP
FETCH C_col into V_TABLe;
EXIT when C_col%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (v_table.table_name||' '||V_table.column_name);
end LOOP;
close c_col;
end;

这是我不断得到的错误: 错误报告 - ORA-06550:第16行,第13栏: PLS-00402:游标的SELECT列表中需要别名以避免重复的列名称 ORA-06550:第16行,第13栏: PL / SQL:项目被忽略 ORA-06550:第20行,第22栏: PLS-00320:此表达式类型的声明不完整或格式错误 ORA-06550:第20行,第5栏: PL / SQL:忽略SQL语句 ORA-06550:第22行,第27栏: PLS-00320:此表达式类型的声明不完整或格式错误 ORA-06550:第22行,第5栏: PL / SQL:语句被忽略 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL / SQL编译错误。 *操作:

1 个答案:

答案 0 :(得分:1)

试试这个,因为错误原因请参阅@Multisync评论

declare
   cursor c_col is
      select T.TABLE_NAME, T.COLUMN_NAME, V.TABLE_NAME VIEW_NAME,
             V.COLUMN_NAME VIEW_COLUMN_NAME
        from (select *
                 from ALL_TAB_COLUMNS T
                where OWNER = 'HR'
                  and TABLE_NAME = 'EMPLOYEES') T
        full outer join (select *
                           from ALL_TAB_COLUMNS
                          where owner = 'HR'
                            and table_name = 'EMP_V') V on T.column_name =
                                                     V.column_NAME
       order by t.column_name, v.column_name;
   v_table c_col%rowtype;
begin
   open C_col;
   loop
      fetch C_col
         into V_TABLe;
      exit when C_col%notfound;
      DBMS_OUTPUT.PUT_LINE(rpad(v_table.table_name || ' ' ||
                                V_table.column_name, 30, ' ') || '|    ' ||
                           v_table.VIEW_NAME || ' ' ||
                           V_table.VIEW_COLUMN_NAME);
   end loop;
   close c_col;
end;