PL / SQL异常循环

微小的

我在数据库中有以下3个表:-人员-事物-类别

“类别”表是新的,因此我必须编写脚本来迁移数据。以前一个人可以有很多东西...现在一个人可以有很多类别,每个类别可以有很多东西。

因此,我必须编写一个遍历事物的脚本,并检查是否已经为事物和人创建了一个组,如果尚未创建一个组,则创建它并更新事物数据。如果已经创建了类别,则只需更新事物数据。

declare
    -- thing
    v_thing_id thing.id%TYPE;
    v_thing_person_id thing.person_id%TYPE;
    v_thing_category_name thing.category_name%TYPE;
    v_thing_category_id thing.category_id%TYPE;

    -- category_name
    v_category_id category.id%TYPE;

    cursor c_thing_ids is
        select b.id
        from thing b
        where category_id is null
    ;

begin
    open c_thing_ids;

    loop
        -- iterate all the thing ids
        fetch c_thing_ids into v_thing_id;

        exit when c_thing_ids%NOTFOUND;

        -- look for already created category for current thing
        select e.id
        into v_category_name_id
        from category e
        where e.person_id = v_thing_person_id
        and e.category_name = v_thing_category_name;

        -- if exists: update thing
        if v_category_name_id is not null then
            update thing
                set category_id = v_category_name_id
                where id = v_thing_id;
        else
        -- if not: create category and update thing
            insert into category (id, category_name)
                values (HIBERNATE_SEQUENCE.NEXTVAL,  v_thing_category_name);
            select e.id
                into v_category_name_id
                from category e
                where e.person_id = v_thing_person_id
                and e.category_name = v_thing_category_name;
            update thing
                set category_id = v_category_name_id
                where id = v_thing_id;
        end if; 
    end loop;
end;

我不是PL / SQL专家,实际上,这是我在“现实生活中”使用它的第二件事,因此,正如预期的那样,我得到一个错误:ORA-01403 in line:

select e.id
    into v_category_name_id
    from category e
    where e.person_id = v_thing_person_id
    and e.category_name = v_thing_category_name;

我该如何处理?我在no_data_found时尝试了异常,但是它抱怨异常不在正确的位置...

思考长臂猿

这应该可以解决问题:

-- look for already created category for current thing
begin 
  select e.id
      into v_category_name_id
      from category e
      where e.person_id = v_thing_person_id
      and e.category_name = v_thing_category_name;
exception when no_data_found then
  v_category_name_id := null;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PL / SQL异常

来自分类Dev

PL / SQL While / For循环

来自分类Dev

PL / SQL实现while循环PL:00103

来自分类Dev

PL / SQL异常不会引发

来自分类Dev

PL / SQL引发处理的异常

来自分类Dev

在PL / SQL中进行循环

来自分类Dev

Pl / SQL嵌套过程异常处理

来自分类Dev

找到数据时,PL SQL引发异常

来自分类Dev

PL / SQL包级别的异常处理

来自分类Dev

函数之间的PL \ SQL异常处理

来自分类Dev

PL / SQL插入新记录异常处理

来自分类Dev

PL/SQL 异常以什么顺序引发?

来自分类Dev

PL / SQL函数在循环后停止运行

来自分类Dev

“ For循环” Oracle PL / SQL中的迭代计数

来自分类Dev

在PL / SQL中的With子句之后使用for循环

来自分类Dev

PL / SQL Oracle 11g循环

来自分类Dev

在PL SQL中的循环内定义游标

来自分类Dev

PL / SQL循环遍历表类型并扩展

来自分类Dev

PL / SQL循环计数问题

来自分类Dev

PL / SQL Oracle 11g循环

来自分类Dev

在PL / SQL中的With子句之后使用for循环

来自分类Dev

在 PL/SQL 变量中循环不是游标

来自分类Dev

PL SQL动态SQL

来自分类Dev

PL / SQL异常处理-函数返回无值

来自分类Dev

如何处理pl / sql中的invalid_identifier异常?

来自分类Dev

如何捕获PL / SQL脚本中的所有异常?

来自分类Dev

如何处理pl / sql中的invalid_identifier异常?

来自分类Dev

PL / SQL异常处理-函数返回无值

来自分类Dev

未在预期的地方引发PL / SQL VALUE_ERROR异常