Неизвестная причина для PLS-00306: неправильное количество или типы аргументов - PullRequest
0 голосов
/ 27 сентября 2018

У меня проблема с простым PL / SQL здесь.Я определил свою таблицу следующим образом:

TYPE tr_GatheredData IS RECORD(
BS_ID          number,
CUSTOMER_NAME  varchar2(200),
MONTH          varchar2(30),
YEAR           number,
LEAKAGE        number);

TYPE tt_GatheredData IS TABLE OF tr_GatheredData;

Впоследствии я пытаюсь вызвать переменную, подобную этой:

results := tt_GatheredData(1, 'lol', 'omg', 2, 3);

Все кажется мне правильным, но я получаю

Ошибка (8,16): PLS-00306: неправильный номер или типы аргументов при вызове 'TT_GATHEREDDATA'

при каждом компиляции.Ребята, скажите, где может быть проблема?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

tt_GatheredData - это набор tr_GatheredData записей, поэтому вам нужно передать ему набор из них, а не (1, 'lol', 'omg', 2, 3).

Как упоминалось в ответе Лукаша, типы записей PL / SQL до Oracle18c - это просто простые многозначные переменные, поэтому, если вам нужен удобный конструктор, вы должны написать свою собственную или объявить каждую tr_GatheredData запись и явно присвоить ей значения.

Типы коллекций поставляются с неявнымиконструкторы, или вы можете явно назначать элементы по одному за раз, если хотите.

Вот один из способов, используя автономный (до 18c) конструктор записей для создания коллекции с несколькими элементами в одном кадре:

declare
    type tr_GatheredData is record
    ( bs_id          number
    , customer_name  varchar2(200)
    , month          varchar2(30)
    , year           number
    , leakage        number );

    type tt_GatheredData is table of tr_GatheredData;
    results tt_GatheredData;

    function new_gathereddata
        ( p_bs_id          number
        , p_customer_name  varchar2
        , p_month          varchar2
        , p_year           number
        , p_leakage        number )
        return tr_GatheredData
    is
        r tr_GatheredData;
    begin
        r.bs_id          := p_bs_id;
        r.customer_name  := p_customer_name;
        r.month          := p_month;
        r.year           := p_year;
        r.leakage        := p_leakage;

        return r;
    end new_gathereddata;

begin
    results :=
        tt_GatheredData
        ( new_gathereddata(1, 'aaa', 'January',  1066, 10)
        , new_gathereddata(2, 'bbb', 'February', 1588, 15)
        , new_gathereddata(3, 'ccc', 'March',    1789, 20) );

    dbms_output.put_line('Collection contains ' || results.count || ' records.');
    dbms_output.put_line('results(3).year = ' || results(3).year);
end;

Выход:

Collection contains 3 records.
results(3).year = 1789
0 голосов
/ 27 сентября 2018

Oracle 18c квалифицированное выражение :

DECLARE
  TYPE tr_GatheredData IS RECORD(
     BS_ID          number,
     CUSTOMER_NAME  varchar2(200),
     MONTH          varchar2(30),
     YEAR           number,
     LEAKAGE        number);

  TYPE tt_GatheredData IS TABLE OF tr_GatheredData;
  results tt_GatheredData;
BEGIN
   results := tt_GatheredData(tr_GatheredData(1, 'lol', 'omg', 2, 3));
   DBMS_OUTPUT.PUT_LINE(results(1).Customer_name);
END;
//

Предыдущие версии:

DECLARE
TYPE tr_GatheredData IS RECORD(
BS_ID          number,
CUSTOMER_NAME  varchar2(200),
MONTH          varchar2(30),
YEAR           number,
LEAKAGE        number);
TYPE tt_GatheredData IS TABLE OF tr_GatheredData;
  results tt_GatheredData;
  t tr_GatheredData ;
BEGIN
   t.BS_ID := 1;
   t.CUSTOMER_NAME := 'lol';
   t.MONTH := 'omg';
   t.YEAR := 2;
   t.LEAKAGE := 3;
   results := tt_GatheredData(t);  -- element has to be record type

   DBMS_OUTPUT.PUT_LINE(results(1).Customer_name);
END;
//

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...