Передача оракула числа в хранимую процедуру из perl - PullRequest
0 голосов
/ 16 мая 2018

У меня есть хранимая процедура, как показано ниже:

x(list IN NUMLIST)

Я звоню из Perl, как показано ниже:

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

Я получаю сообщение об ошибке:

Не удается найти метод объекта "new" через пакет "numlist" (возможно, вы забыли загрузить "numlist"?)

Фактический API имеет 4 аргумента, а второй является проблемным .:

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

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

Может кто-нибудь указать на ошибку здесь.

1 Ответ

0 голосов
/ 16 мая 2018

Если вы хотите передать массив только с одним элементом, адаптируйте свой код:

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

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

Если вы хотите передать коллекцию переменной длины, тогда это возможно в Java но я никогда не видел документированного решения для Perl.

Однако вы можете передать список в виде строки с разделителями, а затем есть много-много способов разделить его наКоллекция в базе данных.Одним из способов является использование этой чистой 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;
/
...