pl/sql 中的 ROWTYPE 定义
Posted
技术标签:
【中文标题】pl/sql 中的 ROWTYPE 定义【英文标题】:ROWTYPE definition in pl/sql 【发布时间】:2013-02-16 13:19:02 【问题描述】:我已经编写了一个 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;
我将如何解决?
*NB:我的系统中没有安装 oracle。我正在使用Oracle Apex Online tool,它使用 Oracle Database 11g 企业版 11.2.0.3.0 和 PL/SQL 版本 11.2.0.3.0
【问题讨论】:
在你的代码中,哪一行是 31? 程序的最后一行 尝试删除̉<<parent>>
,但一定要删除开头的declare
。
我删除了两者,但仍然显示一些错误,请参阅 EvilTeach 答案中的评论。
更新你的帖子,放上新代码,错误信息和行。
【参考方案1】:
作为测试,转到最后一行,在分号后按回车键。 我知道 Pro*C 尤其会在文件末尾没有行终止符的情况下作呕。 你可能会遇到这个问题。
在您的问题范围之外考虑
SELECT columns
FROM TABLE1
MINUS
SELECT columns
FROM TABLE2
和
SELECT columns
FROM TABLE2
MINUS
SELECT columns
FROM TABLE1
【讨论】:
感谢@EvilTeach,该错误现在没有显示,我还删除了 > 并按照 Plouf 的建议在开头声明,但现在显示的错误是第 14 行的错误:PLS- 00310: 使用 %ROWTYPE 属性,'CUR_TAB_NAME.TABLE_NAME' 必须命名表、游标或游标变量第 14 行:rec_comp_result cur_tab_name.TABLE_NAME%rowtype;我知道,cur_tab_name.TABLE_NAME是数据类型varchar2的表名,但是如果我把rec_comp_result cur_tab_name%rowtype;其中 cur_tab_name 是游标变量,则显示错误 第 14 行出错:PLS-00310:使用 %ROWTYPE 属性,'CUR_TAB_NAME.TABLE_NAME' 必须命名表、游标或游标变量第 14 行:rec_comp_result cur_tab_name.TABLE_NAME%rowtype;有什么解决办法?另外,感谢您的建议,但我的要求是获得 A-B。不是(A-B)U(B-A) 我认为,rec_comp_result 没有正确声明并且 cur_tab_name 不是游标变量,但是问题将如何解决?【参考方案2】:使用:cur_tab_name.table_name
。变量CUR_TAB_NAME
的类型是USER_TABLE%ROWTYPE
,因此它有几个字段。
【讨论】:
对不起,我没有得到你。我在第 14 行使用了 cur_tab_name.table_name%rowtype。我应该使用什么?以上是关于pl/sql 中的 ROWTYPE 定义的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中
java - 如何将table%rowtype的oracle pl/sql out参数引用为java中的对象