我编写了一个PL / SQL过程,用于比较两个表之间的数据并打印差异(如果有的话),但扭曲是过程的表名是动态的。这是程序
create or replace PROCEDURE compareTables(
tabA IN VARCHAR2, tabB IN VARCHAR2) AS
cur_tab_name USER_TABLES%ROWTYPE;
lv_sql varchar2(4000);
lv_sql2 varchar2(4000);
BEGIN
--SELECT TABLE_NAME INTO cur_tab_name FROM USER_TABLES WHERE TABLE_NAME = tabA;
lv_sql2 := 'SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = :b_tabA';
EXECUTE IMMEDIATE lv_sql2 INTO cur_tab_name USING tabA;
<<child>>
DECLARE
TYPE cursor_ref IS REF CURSOR;
cur_comp_result cursor_ref;
rec_comp_result cur_tab_name.TABLE_NAME%rowtype;
BEGIN
lv_sql := 'SELECT * FROM '||tabA||' MINUS SELECT * FROM '||tabB;
OPEN cur_comp_result FOR lv_sql;
LOOP
FETCH cur_comp_result INTO rec_comp_result;
EXIT WHEN cur_comp_result%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(rec_comp_result.empid || '' || rec_comp_result.name);
END LOOP;
CLOSE cur_comp_result;
Exception
When others then
dbms_output.put_line('The Problem is '||sqlerrm);
END;
END compareTables;
现在问题是当我编译这个程序时,我收到以下错误
Error at line 14: PLS-00310: with %ROWTYPE attribute, 'CUR_TAB_NAME.TABLE_NAME' must name a table, cursor or cursor-variable
第14行:rec_comp_result cur_tab_name.TABLE_NAME%rowtype;
我将如何解决?
*注意:我的系统中没有安装oracle。我使用的是Oracle Apex Online tool Oracle Database 11g企业版11.2.0.3.0版和 PL / SQL版本11.2.0.3.0
答案 0 :(得分:2)
作为测试,转到最后一行,在分号后按Enter键。 我知道Pro * C特别会在文件末尾没有行终止符时堵塞。 你可能会在说这个问题。
在你的问题范围之外考虑
SELECT columns
FROM TABLE1
MINUS
SELECT columns
FROM TABLE2
和
SELECT columns
FROM TABLE2
MINUS
SELECT columns
FROM TABLE1
答案 1 :(得分:0)
使用:cur_tab_name.table_name
。变量CUR_TAB_NAME
的类型为USER_TABLE%ROWTYPE
,因此它有几个字段。