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? 程序的最后一行 尝试删除̉&lt;&lt;parent&gt;&gt;,但一定要删除开头的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 游标

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

java - 如何将table%rowtype的oracle pl/sql out参数引用为java中的对象

在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误

Oracle PL/SQL Developer:从包过程中返回 %RowType