Неправильные аргументы внутри функции (оракул) - PullRequest
0 голосов
/ 11 марта 2019

У меня есть основная функция:

create or replace function t_owner(tname in varchar2, oname out varchar2)
return varchar2
is
begin
  select owner into oname from table where table_name = 'tname';
  return oname;
end;

select t_owner('table_test') from dual;

Когда я звоню, я получаю это:

ORA-06553: PLS-306: неверный номер или типы аргументов при вызове 'T_OWNER'

Ответы [ 3 ]

1 голос
/ 11 марта 2019

oname должна быть локальной переменной, а не выходным параметром, а tname должна указываться не как строка, а как входной параметр.

create or replace function t_owner(tname in varchar2)
return varchar2
is
    oname table.owner%type;
begin
    select owner into oname 
    from table 
    where table_name = tname;

    return oname;
end;

select t_owner('table_test') from dual;
1 голос
/ 11 марта 2019

Функции не должны иметь параметров OUT; они возвращают это значение в любом случае. Итак:

create or replace function t_owner(tname in varchar2)
  return varchar2  
is
  oname table.owner%type;       --> declare a local variable which will be returned
begin
  select owner into oname from table where table_name = tname;
  return oname;
end;

Если вы хотите использовать параметр OUT, переключитесь на процедуру:

create or replace procedure t_owner(tname in varchar2, oname out varchar2)
is
begin
  select owner into oname from table where table_name = tname;
end;

Вы бы назвали это

declare
  l_out table.owner%type;
begin
  t_owner('table_test', l_out);
  dbms_output.put_line(l_out);
end;
0 голосов
/ 11 марта 2019

функция - это подпрограмма, которая возвращает единственное значение, она неявно возвращает только одно выходное значение, и поэтому нет необходимости определять в качестве аргумента, уже указанного с помощью ключевого слова return.В результате вам нужно избавиться от второго аргумента и преобразовать его в локальную переменную:

create or replace function t_owner( tname mytable.table_name%type )
 return mytable.owner%type
is
  oname mytable.owner%type;
begin
  select owner into oname from mytable where table_name = tname;
  return oname;
end;

Более того

  • удалить кавычки вокруг переменной tname воператор выбора, иначе существование аргумента не имело бы смысла.Потому что не будет использоваться.
  • определяют переменные явно как <table_name>.<column_name>%type, чтобы подчеркнуть то, что они определены, и, скорее всего, может произойти для типа или длины данных связанной таблицы.
  • как зарезервированное ключевое слово, я заменил table на mytable.
...