Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не пойму как обратиться к типу Record в функции  [new]
Balbesco
Guest
Подскажите, пожалуйста.
Изучаю как пользоваться типом Record и столкнулся со следующим
1. Взял пример работы функции с типом record
CREATE OR REPLACE PACKAGE EMP_PKG AS
TYPE EMP_REC IS RECORD (F_NAME VARCHAR2(30), L_NAME VARCHAR2(30), SALARY NUMBER(10,2));
FUNCTION GET_EMP RETURN EMP_REC;
END EMP_PKG;
CREATE OR REPLACE PACKAGE BODY EMP_PKG AS
FUNCTION GET_EMP RETURN EMP_REC AS
  P_EMP EMP_REC;
  BEGIN P_EMP.F_NAME := 'Bob'; P_EMP.F_NAME := 'Smith'; P_EMP.SALARY := 30000;
  RETURN P_EMP;
END;
END EMP_PKG;

2. При попытке обращения к этой функции
DEClare
myrec eMP_PKG.EMP_REC
 ;
begin
select eMP_PKG.GET_EMP() into myrec
 from dual; 
end;

Получаю ошибку
ORA-06550: line 4, column 41:
PL/SQL: ORA-00913: too many values
ORA-06550: line 4, column 4:
PL/SQL: SQL Statement ignored

Что я делаю не так? :)
28 ноя 16, 08:59    [19941298]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
Elic
Member

Откуда:
Сообщений: 29979
Balbesco
select eMP_PKG.GET_EMP() into myrec
 from dual; 
Что я делаю не так? :)
RTFM Assigning Values to Variables with the Assignment Statement (FAQ)
28 ноя 16, 09:04    [19941310]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
hkrvhekrvhe
Guest
DEClare
myrec eMP_PKG.EMP_REC;
begin
myrec:=eMP_PKG.GET_EMP();
dbms_output.put_line(myrec.F_NAME);
end;
28 ноя 16, 12:17    [19942288]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
Balbesco
Guest
Спасибо большое за ответы.
И особенно за ссылку на доку
28 ноя 16, 12:34    [19942368]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
Balbesco
Guest
Подскажите еще по следующему вопросу.
Продолжаю изучению функций.
Задача примерно следующая. Получить на вход функции строку. Разложить ее на несколько полей
Получить как итоговый результат несколько столбцов
Пакет с функцией
create or replace package imp_pkg_test2 as
 type recparse_cl is record
(
id number(10),
pn1_type varchar(10),
pn1_name  varchar(20) ,
pn2_type  varchar(10),
pn2_name  varchar(20),
 signum_name  varchar(4) 
);
type tparse_cl is table of recparse_cl;
function fparse_cl( id number,  str in varchar2)
return tparse_cl pipelined;
end imp_pkg_test2;
/
create or replace package body imp_pkg_test2 as
function fparse_cl( id number,  str in varchar2)
return tparse_cl pipelined as
    parse_cl recparse_cl ;
    lstr varchar(255);
  begin 
    lstr:=replace(str,' ');
    parse_cl.id:=id;
    parse_cl.pn1_type:= regexp_substr (lstr,'^[[:alpha:]]+',1,1);
    parse_cl.pn1_name:=regexp_substr (lstr,'[[:digit:]]+',1,1);
    parse_cl.pn2_type:=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]*)([[:alpha:]]*)',1,1,'i',1) ;
    parse_cl.pn2_name:=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]+)([[:alpha:]]*)',1,1,'i', 2) ;
    parse_cl.signum_name  :=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]*)([[:alpha:]]*)',1,1,'i',3);  
  pipe row(parse_cl);
  return ;
end;
end imp_pkg_test2;
/

Вызов функции . Так работает
select *  from  table(imp_pkg_test2.fparse_cl(1,'вв110-вв 45') )v;

Попытка передачи параметра из таблицы
with vc as (select 'вв110-вв 45' nn from dual)
select *  from 
table (imp_pkg_test2.fparse_cl (1, bb.nn)) v, vc bb

Генерирует ошибку ORA-00904: "BB"."NN": invalid identifier
---
Что я делаю не так? :)
Ожидал , что отработает по аналогии с функцией
SDO_UTIL.GETVERTICES
SELECT c.mkt_id, c.name, t.X, t.Y, t.id
   FROM cola_markets c,
   TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
   ORDER BY c.mkt_id, t.id;


https://docs.oracle.com/database/121/SPATL/GUID-9CF1E8A9-EBCB-4938-BBB6-C2AAFE4897A7.htm#SPATL1237
1 дек 16, 17:55    [19956798]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
stax..
Guest
Balbesco
Подскажите еще по следующему вопросу.
Продолжаю изучению функций.
Задача примерно следующая. Получить на вход функции строку. Разложить ее на несколько полей
Получить как итоговый результат несколько столбцов
Пакет с функцией
create or replace package imp_pkg_test2 as
 type recparse_cl is record
(
id number(10),
pn1_type varchar(10),
pn1_name  varchar(20) ,
pn2_type  varchar(10),
pn2_name  varchar(20),
 signum_name  varchar(4) 
);
type tparse_cl is table of recparse_cl;
function fparse_cl( id number,  str in varchar2)
return tparse_cl pipelined;
end imp_pkg_test2;
/
create or replace package body imp_pkg_test2 as
function fparse_cl( id number,  str in varchar2)
return tparse_cl pipelined as
    parse_cl recparse_cl ;
    lstr varchar(255);
  begin 
    lstr:=replace(str,' ');
    parse_cl.id:=id;
    parse_cl.pn1_type:= regexp_substr (lstr,'^[[:alpha:]]+',1,1);
    parse_cl.pn1_name:=regexp_substr (lstr,'[[:digit:]]+',1,1);
    parse_cl.pn2_type:=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]*)([[:alpha:]]*)',1,1,'i',1) ;
    parse_cl.pn2_name:=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]+)([[:alpha:]]*)',1,1,'i', 2) ;
    parse_cl.signum_name  :=regexp_substr (lstr,'-([[:alpha:]]*)([[:digit:]]*)([[:alpha:]]*)',1,1,'i',3);  
  pipe row(parse_cl);
  return ;
end;
end imp_pkg_test2;
/

Вызов функции . Так работает
select *  from  table(imp_pkg_test2.fparse_cl(1,'вв110-вв 45') )v;

Попытка передачи параметра из таблицы
with vc as (select 'вв110-вв 45' nn from dual)
select *  from 
table (imp_pkg_test2.fparse_cl (1, bb.nn)) v, vc bb

Генерирует ошибку ORA-00904: "BB"."NN": invalid identifier
---
Что я делаю не так? :)
Ожидал , что отработает по аналогии с функцией
SDO_UTIL.GETVERTICES
SELECT c.mkt_id, c.name, t.X, t.Y, t.id
   FROM cola_markets c,
   TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
   ORDER BY c.mkt_id, t.id;


https://docs.oracle.com/database/121/SPATL/GUID-9CF1E8A9-EBCB-4938-BBB6-C2AAFE4897A7.htm#SPATL1237


а если поменять местами
vc bb, table (imp_pkg_test2.fparse_cl (1, bb.nn)) v


.....
stax
1 дек 16, 18:07    [19956837]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
Balbesco
Guest
stax..,

Спасибо большущее!!!
1 дек 16, 18:13    [19956858]     Ответить | Цитировать Сообщить модератору
 Re: Не пойму как обратиться к типу Record в функции  [new]
Balbesco
Guest
Ну и итоговый вопрос.
К опытным товарищам разработчикам.
Как бы они решили эту задачу.
А то ощущение, что понаворотил. И можно было сделать гораздо проще
1 дек 16, 18:19    [19956879]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить