powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не пойму как обратиться к типу Record в функции
8 сообщений из 8, страница 1 из 1
Не пойму как обратиться к типу Record в функции
    #39355710
Balbesco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста.
Изучаю как пользоваться типом Record и столкнулся со следующим
1. Взял пример работы функции с типом record
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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. При попытке обращения к этой функции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
DEClare
myrec eMP_PKG.EMP_REC
 ;
begin
select eMP_PKG.GET_EMP() into myrec
 from dual; 
end;


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

Что я делаю не так? :)
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39355715
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balbesco
Код: plsql
1.
2.
select eMP_PKG.GET_EMP() into myrec
 from dual; 

Что я делаю не так? :)RTFM Assigning Values to Variables with the Assignment Statement (FAQ)
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39355859
hkrvhekrvhe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEClare
myrec eMP_PKG.EMP_REC;
begin
myrec:=eMP_PKG.GET_EMP();
dbms_output.put_line(myrec.F_NAME);
end;
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39355874
Balbesco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ответы.
И особенно за ссылку на доку
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39358773
Balbesco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите еще по следующему вопросу.
Продолжаю изучению функций.
Задача примерно следующая. Получить на вход функции строку. Разложить ее на несколько полей
Получить как итоговый результат несколько столбцов
Пакет с функцией
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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;
/


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


Попытка передачи параметра из таблицы
Код: plsql
1.
2.
3.
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
Код: plsql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39358789
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BalbescoПодскажите еще по следующему вопросу.
Продолжаю изучению функций.
Задача примерно следующая. Получить на вход функции строку. Разложить ее на несколько полей
Получить как итоговый результат несколько столбцов
Пакет с функцией
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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;
/


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


Попытка передачи параметра из таблицы
Код: plsql
1.
2.
3.
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
Код: plsql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39358797
Balbesco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

Спасибо большущее!!!
...
Рейтинг: 0 / 0
Не пойму как обратиться к типу Record в функции
    #39358808
Balbesco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и итоговый вопрос.
К опытным товарищам разработчикам.
Как бы они решили эту задачу.
А то ощущение, что понаворотил. И можно было сделать гораздо проще
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не пойму как обратиться к типу Record в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]