2012-09-03 319 views
1

为什么我会收到此错误,以及解析的语句是什么意思。为什么我得到ORA-01003:没有语句解析错误?

ORA-01003: no statement parsed 

下面是代码:

PROCEDURE ORIGINAL_TABLE.UPDATE_GROUPS IS 
-- cursor loaded with the swam groups 
CURSOR cursor1 IS 
    SELECT ID, NEW_DESCRIPTION 
    FROM [email protected]_LINK.X; 

BEGIN 
    FOR C1_REC IN cursor1 LOOP 
     UPDATE 
      ORIGINAL_TABLE."GROUPS" 
     SET 
      GROUP_ID = C1_REC.ID 
     WHERE 
      ORIGINAL_TABLE."GROUPS".DESCRIPTION = C1_REC.NEW_DESCRIPTION; 

     IF (SQL%ROWCOUNT = 0) THEN 
      INSERT INTO 
        ORIGINAL_TABLE.GROUPS("GROUP_ID", "DESCRIPTION") 
      VALUES (C1_REC.ID, C1_REC.NEW_DESCRIPTION); 
     END IF; 

    END LOOP; 

    EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line(SQLERRM); 
END; 

我试着用上面的代码做的是更新和旧表中的值的新表,并在情况下,新的组没有按”存在插入它。

更新:更改了%ROWCOUNT> 0%ROWCOUNT = 0

+1

您是否在另一窗口中测试了光标查询?我认为这是因为查询 – HRgiger

+0

这是当你编译过程或当你执行它?你有线吗?也许你需要删除测试的异常。还有什么让我困惑的是,为什么当SQL%ROWCOUNT'is> 0应该不是= 0时插入呢?但那不是你的问题。是的,选择是否作为一个单一的声明? – hol

+0

是的选择作为一个单一的声明,它发生在我执行程序时。它编译没有错误。 –

回答

5

用MERGE语句,它更有效地做更新/插入的东西,要注意你的PLSQL没有提供它专供。它试图做一个更新声明,如果一条记录发现它插入另一条记录。为了解决它使用 IF(SQL%ROWCOUNT = 0) 我认为这个问题的原因是。以DBLINK名义。

此外,我建议摆脱引用的表/字段以防万一以及模式名称。

换句话说删除全部ORIGINAL_TABLE。

merge into groups g 
using (
SELECT ID, NEW_DESCRIPTION 
FROM [email protected]_LINK.X 
) nt 
on (nt.NEW_DESCRIPTION = g.description ) 
when matched then update set g.group_id = nt.id 
when non matched then insert(GROUP_ID, DESCRIPTION) 
         values(nt.id, nt.NEW_DESCRIPTION) 
+0

是的,关于ORIGINAL_TABLE我将原来的表格名称更改为在此处发布。 –

+0

块何时失败?在更新或插入语句?注释他们两个替换为NULL;如果它没有帮助让我们继续 –

+0

它执行失败,它不会更新或插入。 –

相关问题