【问题标题】:Building a table of numbers within a FOR LOOP在 FOR LOOP 中构建数字表
【发布时间】:2015-09-22 14:57:32
【问题描述】:

我有以下程序需要从另一个程序调用。

PROCEDURE get_list_ntds_for_given_port(
  pis_olt_name       IN common.types.string
, pis_chasis_lt_port IN common.types.string
, pona_ntd_ids       OUT common_api.ntabtype
)
IS
  lsa_object_name       common_api.vtabtype;
  lsa_link_type         common_api.vtabtype;
  lsa_link_status       common_api.vtabtype;
  lna_link_object_id    common_api.ntabtype;
  lsa_link_object_name  common_api.vtabtype;
  lsa_link_object_class common_api.vtabtype;
  ln_pon_port_id        NUMBER;
  lna_child_pon_result  FLS_NUMBER_TABLE;
  lona_ntd_ids          common_api.ntabtype;
  ls_pon_port_map       common.types.string;
BEGIN
  ls_pon_port_map := pis_olt_name || '/' || pis_chasis_lt_port;
  ln_pon_port_id := nwmdl.alu_pon_port.find(
      pis_full_pon_port_name => ls_pon_port_map
    );
  lna_child_pon_result:= rm.sri_object_utils.get_child_objects(
      pis_proc_name => lc_proc_name
    , pin_parent_id => ln_pon_port_id
    );
    pona_ntd_ids := common_api.ntabtype();
  FOR i IN 1..lna_child_pon_result.COUNT
  LOOP
    rm.ims_objects_api.get_peer_links (
        pin_object_id          => lna_child_pon_result(i)
      , pis_geographical_only  => 'N'
      , pona_object_id         => lona_ntd_ids
      , posa_object_name       => lsa_object_name
      , posa_link_type         => lsa_link_type
      , posa_link_status       => lsa_link_status
      , pona_link_object_id    => lna_link_object_id
      , posa_link_object_name  => lsa_link_object_name
      , posa_link_object_class => lsa_link_object_class
      ); 
    pona_ntd_ids.EXTEND(lona_ntd_ids.COUNT);
    FOR i IN 1..lona_ntd_ids.COUNT 
    LOOP 
      pona_ntd_ids(i) := lona_ntd_ids(i);
    END LOOP;  
  END LOOP;
END get_list_ntds_for_given_port;

我用这个 pl-sql 块模拟外部调用:

SET SERVEROUTPUT ON;
DECLARE
lona_ntd_ids common_api.ntabtype;
BEGIN
svcmgr_lni.design_and_assign.get_list_ntds_for_given_port( pis_olt_name        =>  'SWOLT0000003DV'
                              ,pis_chasis_lt_port =>  '1-1/LT1/1'
                              ,pona_ntd_ids       => lona_ntd_ids
                             );
     FOR i IN 1..lona_ntd_ids.COUNT 
      LOOP                       
      DBMS_OUTPUT.PUT_LINE(lona_ntd_ids(i)); 
      END LOOP; 
 END;

问题是我在输出中没有得到任何结果。 我的猜测是,我的rm.ims_objects_api.get_peer_links API 将为rm.sri_object_utils.get_child_objects 找到的每个lna_child_pon_result(i) 调用,并将更准确地在每个输出参数中放入 API 的 OUT 参数一个数字(id)或 varchar 表。 我想要实现的是构建主 PROCEDURE(get_list_ntds_for_given_port) 的数字表并将其设置为输出参数,以便在主过程之外使用该数字表。 请留下您对解决此问题的任何想法。

【问题讨论】:

  • 这可能无法解决您的问题 - 但在内部循环中,“pona_nt_ids(i)”对于每个外部循环都会以 i=1 开头。这是故意的吗?
  • common_api.ntabtype的定义是什么?
  • 回答你的第一个问题:不,这不是故意的,现在改了。

标签: oracle plsql procedure


【解决方案1】:

试试这个:

移动“pona_ntd_ids := common_api.ntabtype();”在循环之外:

pona_ntd_ids := common_api.ntabtype();
FOR i IN 1..lna_child_pon_result.COUNT

改变

pona_ntd_ids(i) := lona_ntd_ids(i);

pona_ntd_ids(pona_ntd_ids.COUNT+1) := lona_ntd_ids(i); 

由于在您的原始代码中,您为每个循环都初始化了 pona_ntd_ids,如果最后一次外部迭代产生 lona_ntd_ids.COUNT=0,您最终将一无所获。

【讨论】:

  • 第二次更改引发Subscription beyond count 错误。非常感谢您的回答。
  • 将这一行 pona_ntd_ids(pona_ntd_ids.COUNT+1) := lona_ntd_ids(i); 设置为这一行 pona_ntd_ids(pona_ntd_ids.COUNT) := lona_ntd_ids(i); 似乎可以解决问题
  • 哦,是的 - 我忘记了 EXTEND 的显式使用 - 根据 common_api.ntabtype 的定义,这可能是必需的 :-)
  • create or replace TYPE "NTABTYPE" AS TABLE OF NUMBER;
  • 所以ntabtype的类型是数字表
【解决方案2】:

您可以做一些修改并批量收集整个对象,然后将其作为 OUT 参数。是的,这将是程序的开销,因为使用了正则表达式,但它足以满足您的查询。

FOR i IN 1..lona_ntd_ids.COUNT 
    LOOP 
    lv_eg_string := lona_ntd_ids(i)||','||lv_eg_string;
--      pona_ntd_ids(i) := lona_ntd_ids(i);
    END LOOP; 
    lv_eg_string:=substr(lv_eg_string,1,length(lv_eg_string)-1);
    SELECT regexp_substr(lv_eg_string,'[^,]+', 1, level) BULK COLLECT
    INTO pona_ntd_ids
    FROM dual
   CONNECT BY regexp_substr(lv_eg_string, '[^,]+', 1, level);

【讨论】:

  • Regex 会带来这么多开销吗?
  • 是的,但如果数据量较少,我们不需要太担心:)
  • 好的,我会看看这两个答案的表现并决定使用什么,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2012-04-01
  • 2022-11-17
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多