powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование сложного типа строки (ошибка ORA-00904)
9 сообщений из 9, страница 1 из 1
Использование сложного типа строки (ошибка ORA-00904)
    #39439655
Sp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!

В Oracle недавно, поэтому прошу ногами не бить. Можно ли использовать такой прием? Если да, то что я сделал неправильно?
Создал тип:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create or replace type UFD_TYP_ASV_ADDRESS as object
(
  -- Attributes
  country char(3),
  post_index char(10),
  region char(50),
  -- Member functions and procedures
  member function set_address/*(new_country in char, new_post_index in char, new_region in char)*/ return UFD_TYP_ASV_ADDRESS
)
/
create or replace type body UFD_TYP_ASV_ADDRESS is
  -- Member procedures and functions
  member function set_address /*(new_country in char, new_post_index in char, new_region in char)*/ return UFD_TYP_ASV_ADDRESS is
    address UFD_TYP_ASV_ADDRESS := self; -- initialize to "current" object
  begin
    address.country := 'RU';--new_country;
    address.post_index := '123456';--new_post_index;
    address.region := 'Perm';--new_region;
    return address;
  end;
end;


Затем создаю пакет:
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
create or replace package UFD_PKG_ASV is
  --тип данных строки таблицы INV (клиенты)
  type rowINV is record
  (client_id bkcli.cli%type -- id клиента
  ,surname bkcli.nom%type -- Фамилия
  ,name bkcli.pre%type -- Имя
  ,patronymic bkcli.midname%type -- Отчество
  ,birthday bkcli.dna%type -- Дата рождения
  ,adr_reg UFD_TYP_ASV_ADDRESS -- Адрес регистрации
  );
  --тип данных таблицы из строк rowINV
  type tblINV is table of rowINV;
  --функция INV
  function INV
  (prmReportDate in date default null -- Отчетная дата (например, 01/04/2017)
  )
  return tblINV
  pipelined;
end UFD_PKG_ASV;
/
create or replace package body UFD_PKG_ASV is
  --функция INV
  function INV
  (prmReportDate in date default null -- Отчетная дата (например, 01/04/2017)
  )
  return tblINV
  pipelined
  is
    currentRow rowINV;
    date1 date;
  begin
    date1 := coalesce(prmReportDate, current_date);
    for currentRow in (
    select distinct
           cl.cli as client_id
          ,trim(cl.nom) as surname
          ,trim(cl.pre) as name
          ,trim(cl.midname) as patronymic
          ,cl.dna as birthday
          ,ufd_typ_asv_address.set_address as adr_reg -- Error: PL/SQL: ORA-00904: "UFD_TYP_ASV_ADDRESS"."SET_ADDRESS": invalid identifier
      from bkcli cl
    )
    loop
      pipe row (currentRow);
    end loop;
  end;
end UFD_PKG_ASV;
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39439663
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sp999
Код: plsql
1.
,ufd_typ_asv_address.set_address 

Подскажи Oracle-у, что это метод, а не столбец.
Sp999Можно ли использовать такой прием?Цель? Этот "приём" у тебя ещё пяток раз упадёт.
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39439664
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sp999,


Oracle / PLSQL: ORA-00904 Error Message

Learn the cause and how to resolve the ORA-00904 error message in Oracle.

Description

When you encounter an ORA-00904 error, the following error message will appear:

ORA-00904: invalid identifier

Cause

You tried to execute a SQL statement that included an invalid column name or the column name is missing. This commonly occurs when you reference an invalid alias in a SELECT statement.

Хуглить не пробовал?
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39439679
Sp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicSp999
Код: plsql
1.
,ufd_typ_asv_address.set_address 

Подскажи Oracle-у, что это метод, а не столбец.
А как это сделать?
ElicSp999Можно ли использовать такой прием?Цель? Этот "приём" у тебя ещё пяток раз упадёт.
Хотелось бы построить лаконичную структуру, у записи будет несколько типов адресов (регистрации, нахождения, почтовый), и вместо того, чтобы для каждого писать набор столбцов, использовать столбец-структуру.
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39439681
Sp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saxarockSp999,

Хуглить не пробовал?
Пробовал, все что нашел - это грешение на нерозданные права.
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39439689
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sp999Elicпропущено...
Подскажи Oracle-у, что это метод, а не столбец.
А как это сделать?


Ну так погугли как вызывать функцию из SELECT.
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39440039
Sp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал упростить для начала задачу - вызываю просто одну функцию:
Код: plsql
1.
select ufd_typ_asv_address.set_address from dual; -- Результат ORA-00904: "UFD_TYP_ASV_ADDRESS"."SET_ADDRESS": invalid identifier


Пробую по-другому:
Код: plsql
1.
select ufd_typ_asv_address.set_address() from dual; -- Результат ORA-06553: PLS-306: wrong number or types of arguments in call to "SET_ADDRESS"


Ладно, раз в оракле функция без параметров объявляется как-то не по-людски, добавим туда хотя бы один параметр:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create or replace type UFD_TYP_ASV_ADDRESS as object
(
  -- Attributes
  country char(3),
  post_index char(10),
  region char(50),
  -- Member functions and procedures
  member function set_address(new_country in char) return UFD_TYP_ASV_ADDRESS
)
/
create or replace type body UFD_TYP_ASV_ADDRESS is
  -- Member procedures and functions
  member function set_address (new_country in char) return UFD_TYP_ASV_ADDRESS is
    address UFD_TYP_ASV_ADDRESS := self; -- initialize to "current" object
  begin
    address.country := new_country;
    address.post_index := '123456';--new_post_index;
    address.region := 'Perm';--new_region;
    return address;
  end;
end;


и пробуем вызвать:
Код: plsql
1.
select ufd_typ_asv_address.set_address('RU') from dual; -- Результат ORA-06553: PLS-306: wrong number or types of arguments in call to "SET_ADDRESS"



Мои варианты иссякли, блин, как оно должно вызываться?
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39440050
Stawros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sp999Мои варианты иссякли, блин, как оно должно вызываться?
Ну в доке же написано -

To invoke a method, use the following syntax:
<object_name>.<method_name>([parameter_list])


"object_name", а не "type_name". Вот и вызывайте метод у объекта:

Код: plsql
1.
select (ufd_typ_asv_address('1','123','asd')).set_address('RU') from dual
...
Рейтинг: 0 / 0
Использование сложного типа строки (ошибка ORA-00904)
    #39440051
Sp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stawros,

Большое человеческое спасибо за помощь!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование сложного типа строки (ошибка ORA-00904)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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