【问题标题】:how to use the return values of a query within the store procedure如何在存储过程中使用查询的返回值
【发布时间】:2014-08-13 12:21:19
【问题描述】:

我在使用Oracle,我想定义一个如下的存储过程,基本上它会检查传入的p_id是否为null,如果为null则使用table_1的序列生成一个id,否则使用传入的p_id。

tbl_ids_type 是我定义的嵌套表类型,包含数字id。

我想做的是在LOOP部分,在插入table_2之前,我想查询table_2为select name1, name2 from table_2 where s_id = p_id_list(i),这是因为具有特定s_id的记录可能已经存在于表中,我想重新使用name1 和 name2 的值。

我该怎么做?

procedure save
(
    p_id                         number default null,
    p_name                       varchar2 default null,
    p_id_list                    tbl_ids_type default null,
    p_user_id                    number default null
)
is
    tmp_id numeric;
begin
    if p_id is null then
        tmp_id := seq_1.nextval;
        insert into table_1 (
            id,
            name,
            original_id,
            user_id,
            )
        values(
            tmp_id, 
            p_name,
            -1,
            p_user_id,
        for i in 1 .. p_id_list.COUNT
        LOOP              
            insert into table_2(
                s_id,
                id,
                name1,
                name2,
                user_id
                )
            values (p_id_list(i), tmp_id, 'test_name1', 'test_name2', p_user_id);
        END LOOP;
    else
        delete from table_1 where id = p_id and user_id = p_user_id;
        delete from table_2 where id = p_id and user_id = p_user_id;
        insert into table_1 (
            id,
            name,
            original_id,
            user_id,
            )
        values(
            p_id, 
            p_name,
            '-1',
            p_user_id,
        for i in 1 .. p_id_list.COUNT
        LOOP
            insert into table_2(
                s_id,
                id,
                name1,
                name2,
                user_id
                )
            values (p_id_list(i), p_id, 'test_name1', 'test_name2', p_user_id);
        END LOOP;          
    end if;
end save_report;

【问题讨论】:

    标签: oracle stored-procedures plsql


    【解决方案1】:

    在您的 LOOP 语句中,只需运行该查询,如果您找到值,请将它们存储在一个变量中。所以你会添加类似的东西

    BEGIN
     select name1, name2
      into l_name_1, l_name_2
      from table_2 
     where s_id = p_id_list(i);
    EXCEPTION WHEN NO_DATA_FOUND
     THEN
     l_name_1 := 'Some Default';
     l_name_2 := 'or maybe Null';
    END;
    

    然后您只需将插入语句更改为

    insert into table_2(
                s_id,
                id,
                name1,
                name2,
                user_id
                )
            values (p_id_list(i), tmp_id, l_name_1, l_name_2, p_user_id);
    

    您可能还想在该匿名块中为 TOO_MANY_ROWS 添加一个处理程序。

    【讨论】:

      【解决方案2】:

      试试这个。您正在寻找 INTO 关键字

      l_name1 VARCHAR := NULL
      l_name2 VARCHAR := NULL
      
      for i in 1 .. p_id_list.COUNT
          LOOP
              BEGIN
                  select name1, name2 INTO l_name1, l_name2 from table_2 where s_id = p_id_list(i)
              EXCEPTION
                  WHEN_NO_DATA_FOUND
                      //Set l_name1 and l_name2 to what you want to
              END
              insert into table_2(
                      s_id,
                      id,
                      name1,
                      name2,
                      user_id
                      ) values (p_id_list(i), p_id, 'test_name1', 'test_name2', p_user_id);
      

      如果您认为我遗漏了什么,请告诉我。

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 2011-03-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多