powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция с параметром ROWTYPE в объектном типе
3 сообщений из 3, страница 1 из 1
Функция с параметром ROWTYPE в объектном типе
    #39487939
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем,
пришел из Java в PL/SQL. Заморочился ООП в PL/SQL. База 12.1

Имеется код

Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE TYPE my_user.typ$my_type AS OBJECT
(id   NUMBER,

        MEMBER PROCEDURE execute_proc_which_called_proc_save_data,
	MEMBER PROCEDURE save_data(p_data my_user.my_table%ROWTYPE)

)



Ошибка, ругается на save_data(p_data my_user.my_table%ROWTYPE): PLS-00329: тип на уровне схемы имеет недопустимую ссылку на my_user.my_table

Предполагаю, что причина SQL не знает о PL/SQL-ом ROWTYPE. Хотелось бы узнать, есть ли способы обойти данное ограничение.
Смысл процедуры, чтобы она записывала значения в базу приходящие в неё параметры.

Если создавать процедуру в пакете pac$my_awesome_package, то все компилируется
Код: plsql
1.
PROCEDURE save_data(p_record my_table%ROWTYPE);



Пока вижу 4 варианта:
1. MEMBER PROCEDURE save_data(param1, param2, ... , param100), где param1, param2, ..., param100 - поля my_table. Неудобно, если структура таблицы меняется.
2. Создать ещё один тип typ$my_table, который бы в точности повторял структуру таблицы. Но если структура будет меняться (а она будет меняться часто), перспектива перекомпилировать её саму и зависимые от неё пакеты (а их будет много) весьма удручает.
3. Наиболее компромиссный на данный момент вариант, но его я не проверял, не знаю будет ли он работать. Не объявлять в самом в типе "проблемную" процедуру, а в "БЕСпроблемной процедуре" execute_proc_which_called_proc_save_data в нужных местах вызывать "проблемную" процедуру из пакета pac$my_awesome_package.save_data(p_record my_table%ROWTYPE).
Но тогда придется поддерживать пакет + тип. Хотелось бы что-то одно.

Т.е., что-то вроде этого
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE TYPE my_user.typ$my_type AS OBJECT ...
...
MEMBER PROCEDURE execute_proc_which_called_proc_save_data...
   l_record my_table%ROWTYPE;
 BEGIN
   ...
   pac$my_awesome_package.save_data(l_record);
   ...
 END;  
  ...



4. Забить на ООП и делать всё в пакете. Насколько, в силу своего опыта могу судить, в рамках одной сессии пакет=singlton odject. Тогда я лишаюсь возможности безболезненно плодить экземпляры объектов в промышленных масштабах в рамках одной сессии.
Типа (P.S. Псевдоязык)
[SRC PLSQL]
...
for(i=0 ; i < limit_number; i++){
...
l_item := new my_type();
l_item.do_somethink.(i);
...
}
[/LSQL]
Смотрел в сторону anytype, anydatatype. Может плохо смотрел. Может быть есть волшебная функция типа
GET_MYROWTYPE _AFTER_CAST_ANYTYPE_TO_MYROWTYPE(...) RETURN MYROWTYPE ?
Прошу помощи Спасибо.
...
Рейтинг: 0 / 0
Функция с параметром ROWTYPE в объектном типе
    #39487994
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringoЗабить на ООПВполне мудро. ООП ради ООПа - это о опа.
...
Рейтинг: 0 / 0
Функция с параметром ROWTYPE в объектном типе
    #39488069
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringo...безболезненно плодить экземпляры объектов в промышленных масштабах...
это - свидетельство явы головного мозга.
(Если собрать вместе все, что Дейкста наговорил о КОБОЛе, ФОРТРАНе и Бейсике - получится годное высказывание на тему явы).

Что до anydata/anytype - можно привлечь dbms_sql для получения describe интересующего тебя объекта схемы,
и потом паковать.
Годный пример смотри здесь:
http://www.oracle-developer.net/display.php?id=422
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция с параметром ROWTYPE в объектном типе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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