Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
Добрый день. Прошу помощи, т.к. второй день бьюсь с проблемой.
Задача создать ф-ю возвращающую список сотрудников (т.е. массив), у которых SALARY больше заданной. (Желательно через явный курсор). Пробовал по всякому: и через пакет создвать типы, так и через явное создание (CREATE TYPE...)

create or replace package emp_pkg is
TYPE emp_rec IS RECORD (last_name employees.last_name%type, salary employees.salary%type);
TYPE emp_tab IS TABLE OF emp_rec;
function var_emp_sal (p_sal IN employees.salary%type default null) return emp_tab pipelined;
end emp_pkg;

create or replace package body emp_pkg is
function var_emp_sal (p_sal IN employees.salary%type) return emp_tab is
cursor cur_emp is select t.last_name, t.salary from employees t where t.salary > p_sal;
v_emp cur_emp%rowtype;
v_emp_tab emp_tab;

begin

open cur_emp;
loop
fetch cur_emp into v_emp;
v_emp_tab := emp_tab(v_emp.last_name, v_emp.salary);
exit when cur_emp%notfound;
end loop;
close cur_emp;
return v_emp_tab;
end ;
end emp_pkg;

Как бы я не делал, все сводится к одному:
Ошибка: PLS-00306: ошибочное число или типы аргументов при обращении к 'EMP_TAB'. (на выделенной строке)
16 фев 17, 11:24    [20216932]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
школьное задание
Guest
Aleksey31,

у плскл массива нет конструктора. а занафиг вообще массив, да и функция тоже.
16 фев 17, 11:47    [20217046]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
школьное задание,
Я вас не понял. Вот описан массив:
TYPE emp_rec IS RECORD (last_name employees.last_name%type, salary employees.salary%type);
TYPE emp_tab IS TABLE OF emp_rec;

А зачем нужно и т.д. это отдельная тема.
16 фев 17, 11:51    [20217074]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
терапед
Guest
Aleksey31
А зачем нужно и т.д. это отдельная тема.
вот прийдешь ты к врачу - втираю мазь в пятку, а ухо все равно болит. Полагаешь он тебе пакажет как правильно втирать?
16 фев 17, 11:58    [20217112]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
терапед
Aleksey31
А зачем нужно и т.д. это отдельная тема.
вот прийдешь ты к врачу - втираю мазь в пятку, а ухо все равно болит. Полагаешь он тебе пакажет как правильно втирать?

Прошу не флудить. Лучше бы дельное что нибудь сказал.
16 фев 17, 12:25    [20217223]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
efendi
Member

Откуда:
Сообщений: 94
Aleksey31
Добрый день. Прошу помощи, т.к. второй день бьюсь с проблемой.
Задача создать ф-ю возвращающую список сотрудников (т.е. массив), у которых SALARY больше заданной. (Желательно через явный курсор). Пробовал по всякому: и через пакет создвать типы, так и через явное создание (CREATE TYPE...)

create or replace package emp_pkg is
TYPE emp_rec IS RECORD (last_name employees.last_name%type, salary employees.salary%type);
TYPE emp_tab IS TABLE OF emp_rec;
function var_emp_sal (p_sal IN employees.salary%type default null) return emp_tab pipelined;
end emp_pkg;

create or replace package body emp_pkg is
function var_emp_sal (p_sal IN employees.salary%type) return emp_tab is
cursor cur_emp is select t.last_name, t.salary from employees t where t.salary > p_sal;
v_emp cur_emp%rowtype;
v_emp_tab emp_tab;

begin

open cur_emp;
loop
fetch cur_emp into v_emp;
v_emp_tab := emp_tab(v_emp.last_name, v_emp.salary);
exit when cur_emp%notfound;
end loop;
close cur_emp;
return v_emp_tab;
end ;
end emp_pkg;

Как бы я не делал, все сводится к одному:
Ошибка: PLS-00306: ошибочное число или типы аргументов при обращении к 'EMP_TAB'. (на выделенной строке)


pipelined лишний
16 фев 17, 14:42    [20217944]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
efendi
Member

Откуда:
Сообщений: 94
efendi,

поспешил немногою надо так:

create or replace package body emp_pkg is
function var_emp_sal (p_sal IN employees.salary%type) return emp_tab is
  cursor cur_emp is select t.last_name, t.salary from employees t where t.salary > p_sal;
  v_emp cur_emp%rowtype;
  v_emp_tab emp_tab;
  k number := 0;
begin
  v_emp_tab.delete;
  open cur_emp;
  loop
    fetch cur_emp into v_emp;
    exit when cur_emp%notfound;
    k := k + 1;  
    v_emp_tab(k).last_name :=  v_emp.last_name;
    v_emp_tab(k).salary := v_emp.salary;
  end loop;
  close cur_emp;
  return v_emp_tab;
end ;
end emp_pkg;
16 фев 17, 14:48    [20217971]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
efendi
efendi,

поспешил немногою надо так:

create or replace package body emp_pkg is
function var_emp_sal (p_sal IN employees.salary%type) return emp_tab is
  cursor cur_emp is select t.last_name, t.salary from employees t where t.salary > p_sal;
  v_emp cur_emp%rowtype;
  v_emp_tab emp_tab;
  k number := 0;
begin
  v_emp_tab.delete;
  open cur_emp;
  loop
    fetch cur_emp into v_emp;
    exit when cur_emp%notfound;
    k := k + 1;  
    v_emp_tab(k).last_name :=  v_emp.last_name;
    v_emp_tab(k).salary := v_emp.salary;
  end loop;
  close cur_emp;
  return v_emp_tab;
end ;
end emp_pkg;

Благодарю тебя!!! pipelined остался с прошлого раза (через него также пробовал) :)
16 фев 17, 14:59    [20218017]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27297
efendi
  cursor cur_emp is select t.last_name, t.salary from employees t where t.salary > p_sal;
  v_emp cur_emp%rowtype;
  k number := 0;
…
  v_emp_tab.delete;
  open cur_emp;
  loop
    fetch cur_emp into v_emp;
    exit when cur_emp%notfound;
    k := k + 1;  
    v_emp_tab(k).last_name :=  v_emp.last_name;
    v_emp_tab(k).salary := v_emp.salary;
  end loop;
  close cur_emp;
Весь этот говнокод заменяется одной командой.
16 фев 17, 15:06    [20218038]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
efendi,
опять ступор. Видимо совсем дурной..)
Пытаюсь вызвать(проверить) :

select * from table(emp_pkg.var_emp_sal(12000))
Ошибка: ORA-00902 Неверный тип данных
16 фев 17, 15:20    [20218083]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
Elic, спасибо. ПРосто не мог понять в чем проблема, дело принципа. А так еще лучше если без курсора:
select t.last_name, t.salary BULK COLLECT INTO v_emp_tab from employees t where t.salary > p_sal;
16 фев 17, 15:25    [20218102]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27297
Aleksey31
select * from table(emp_pkg.var_emp_sal(12000))
Ошибка: ORA-00902 Неверный тип данных
Не знает SQL никаких ни PL/SQL-записей, ни PL/SQL-коллекций.
16 фев 17, 16:08    [20218316]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
Elic,
а как же тогда работает например тут: [url=]https://habrahabr.ru/post/119996/[/url]
Делал по пример можно сказать.
16 фев 17, 16:11    [20218335]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
123йй
Member

Откуда:
Сообщений: 1288
Aleksey31,

а там pipelined не лишний.
даже списать не получается ?
16 фев 17, 16:18    [20218369]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27297
Aleksey31
а как же тогда работает например тут: [url=]https://habrahabr.ru/post/119996/[/url]
Делал по пример можно сказать.

Aleksey31
pipelined остался с прошлого раза
За pipelined скрыто много магии.
16 фев 17, 16:19    [20218375]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
123йй,

уже решили проблему составления. Пепилинд лишний(нечаянно остался). Теперь проблема с вызовом.
16 фев 17, 16:19    [20218381]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типами в FUNCTION.  [new]
Aleksey31
Member

Откуда:
Сообщений: 17
Elic,

спасибо, понял куда копать! Буду пробовать.
16 фев 17, 16:22    [20218394]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить