将oracletable的数字传递给perl的存储过程

时间:2018-05-16 09:22:11

标签: oracle perl dbi

我有如下存储过程:

x(list IN NUMLIST)

我从perl打电话如下:

$lAeging->execute(new numlist(134))

我收到的错误如下:

  

找不到对象方法" new"通过包" numlist" (也许你忘了加载" numlist"?)

实际的api有4个args,第二个是有问题的。:

$lAeging = $gDBH->prepare(q{
        BEGIN
            X(?,?,?,?);
        END;
    });

$lAeging->execute('XXXXX',
                      new numlist(134),
                      $gStartDatepassed,
                      $gEndDatePassed);

任何人都可以在这里指出错误。

1 个答案:

答案 0 :(得分:1)

如果您只想传递一个包含单个元素的数组,那么请调整代码:

$lAeging = $gDBH->prepare(q{
        BEGIN
            X(?,NUMLIST(?),?,?);
        END;
    });

$lAeging->execute(
    'XXXXX',
    134,
    $gStartDatepassed,
    $gEndDatePassed
  );

如果你想传递一个可变长度的集合,那么这是possible in Java但我从未见过Perl的文档化解决方案。

但是,您可以将列表作为分隔字符串传递,然后有many, many ways将其拆分回数据库中的集合。一种方法是使用这个纯PL / SQL函数:

CREATE OR REPLACE FUNCTION split_Number_List(
  i_str    IN  VARCHAR2,
  i_delim  IN  VARCHAR2 DEFAULT ','
) RETURN NUMLIST DETERMINISTIC
AS
  p_result       NUMLIST := NUMLIST();
  p_start        NUMBER(5) := 1;
  p_end          NUMBER(5);
  c_len CONSTANT NUMBER(5) := LENGTH( i_str );
  c_ld  CONSTANT NUMBER(5) := LENGTH( i_delim );
BEGIN
  IF c_len > 0 THEN
    p_end := INSTR( i_str, i_delim, p_start );
    WHILE p_end > 0 LOOP
      p_result.EXTEND;
      BEGIN
        p_result( p_result.COUNT ) := TO_NUMBER( SUBSTR( i_str, p_start, p_end - p_start ) );
      EXCEPTION
        WHEN OTHERS THEN
          p_result( p_result.COUNT ) := NULL;
      END;
      p_start := p_end + c_ld;
      p_end := INSTR( i_str, i_delim, p_start );
    END LOOP;
    IF p_start <= c_len + 1 THEN
      p_result.EXTEND;
      BEGIN
        p_result( p_result.COUNT ) := TO_NUMBER( SUBSTR( i_str, p_start, c_len - p_start + 1 ) );
      EXCEPTION
        WHEN OTHERS THEN
          p_result( p_result.COUNT ) := NULL;
      END;
    END IF;
  END IF;
  RETURN p_result;
END;
/