powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструктор по умолчанию без параметров
17 сообщений из 17, страница 1 из 1
Конструктор по умолчанию без параметров
    #39904582
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Версия оракла 11.2.

Хочу создать конструктор, чтобы работали конструкции вида:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
DECLARE 
  r_test test_obj;
BEGIN
  r_test.a := 'Test';
  
  dbms_output.put_line(r_test.a);
END;



а не выдавало ошибку:

Код: plsql
1.
ORA-06530: Referece to uninitialized composite



Вот мои конструкторы:
Первый вариант:

Код: 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.
48.
CREATE OR REPLACE TYPE test_obj as object
(
    a VARCHAR2(100),
    b NUMBER(10),
    
    CONSTRUCTOR FUNCTION test_obj(
      SELF IN OUT test_obj
      , p_a VARCHAR2
      , p_b NUMBER
    ) 
      RETURN SELF AS RESULT,
                                          
    CONSTRUCTOR FUNCTION test_obj(
      SELF IN OUT test_obj
    ) 
      RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY test_obj 
AS
  CONSTRUCTOR FUNCTION test_obj(
    SELF IN OUT test_obj
    , p_a VARCHAR2
    , p_b NUMBER
  ) 
    RETURN SELF AS RESULT,
  IS
  BEGIN
    SELF.a := p_a;            
    SELF.b := p_b;
        
    RETURN;
  END;
  
  CONSTRUCTOR FUNCTION test_obj(
    SELF IN OUT test_obj
  ) 
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.a := NULL;            
    SELF.b := NULL;
    
    RETURN;
  END;
END;
/



Ещё был такой вариант второго конструктора, но что-то тоже не работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CONSTRUCTOR FUNCTION test_obj(
    SELF IN OUT test_obj
  ) 
    RETURN SELF AS RESULT
  IS
    r_init test_obj := test_obj(NULL, NULL);
  BEGIN
    SELF := r_init;
    
    RETURN;
  END;



Что я делаю не так?
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904616
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMNO

Что я делаю не так?


Инициализировать объект надо после BEGIN.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE 
  r_test test_obj;
BEGIN
  r_test := test_obj();

  r_test.a := 'Test';
  
  dbms_output.put_line(r_test.a);
END;
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904640
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Код: plsql
1.
2.
DECLARE 
  r_test test_obj;

Тут нет вызова никакого конструктора. Конструктор даже без параметров надо явно вызывать.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904641
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpovarov
Инициализировать объект надо после BEGIN.
Бред.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904675
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Тут нет вызова никакого конструктора. Конструктор даже без параметров надо явно вызывать.


Два чая этому джентльмену.

Следующий вопрос.

Переписал констркутор и вызов следующим образом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
DECLARE 
  r_test test_obj := test_obj();
BEGIN
  r_test.a := 'Test';
  
  dbms_output.put_line(r_test.a);
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.
CREATE OR REPLACE TYPE test_obj as object
(
    a VARCHAR2(100),
    b NUMBER(10),
    
    CONSTRUCTOR FUNCTION test_obj(
      p_a   VARCHAR2
      , p_b NUMBER
    ) 
      RETURN SELF AS RESULT,
                                          
    CONSTRUCTOR FUNCTION test_obj
      RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY test_obj 
AS
  CONSTRUCTOR FUNCTION test_obj(
    p_a   VARCHAR2
    , p_b NUMBER
  ) 
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.a := p_a;            
    SELF.b := p_b;
        
    RETURN;
  END;
  
  CONSTRUCTOR FUNCTION test_obj
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.a := NULL;            
    SELF.b := NULL;
    
    RETURN;
  END;
END;
/



Но теперь у меня не работает вариант с передачей параметров, хотя соотвествующий конструктор вроде есть:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
DECLARE 
  r_test test_obj := test_obj(NULL, NULL);
BEGIN
  r_test.a := 'Test';
  
  dbms_output.put_line(r_test.a);
END;



Ошибка:

Код: plsql
1.
PLS-00307: too many declarations of "TEST_OBJ" match this call



Что не так?
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904684
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Код: plsql
1.
PLS-00307: too many declarations of "TEST_OBJ" match this call

Что не так?
Конструктор по-умолчанию никуда не делся. Нахрена ты создал ещё один такой же?

Ты судорожно пытаешься "автоматизировать" то, чего не понимаешь. Почитай документацию сперва.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904695
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я лох, признаю.

Вот работающий вариант:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE TYPE test_obj as object
(
    a VARCHAR2(100),
    b NUMBER(10),
              
    CONSTRUCTOR FUNCTION test_obj
      RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY test_obj 
AS
  CONSTRUCTOR FUNCTION test_obj
    RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.a := NULL;            
    SELF.b := NULL;
    
    RETURN;
  END;
END;
/



Спасибо.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904698
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Код: plsql
1.
2.
    SELF.a := NULL;            
    SELF.b := NULL;

Что случится, если убрать?
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904891
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Я лох, признаю.
Вот работающий вариант:


Да ну:

Код: 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.
SQL> CREATE OR REPLACE TYPE test_obj as object
  2  (
  3      a VARCHAR2(100),
  4      b NUMBER(10),
  5                
  6      CONSTRUCTOR FUNCTION test_obj
  7        RETURN SELF AS RESULT
  8  ) NOT FINAL;
  9  /

Type created.

SQL> 
SQL> CREATE OR REPLACE TYPE BODY test_obj 
  2  AS
  3    CONSTRUCTOR FUNCTION test_obj
  4      RETURN SELF AS RESULT
  5    IS
  6    BEGIN
  7      SELF.a := NULL;            
  8      SELF.b := NULL;
  9      
 10      RETURN;
 11    END;
 12  END;
 13  /

Type body created.

SQL> set serveroutput on
SQL> DECLARE 
  2    r_test test_obj;
  3  BEGIN
  4    r_test.a := 'Test';
  5    
  6    dbms_output.put_line(r_test.a);
  7  END;
  8  /
DECLARE
*
ERROR at line 1:
ORA-06530: Reference to uninitialized composite
ORA-06512: at line 4


SQL> 



SY.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904899
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так:

авторDECLARE
r_test test_obj := test_obj();
BEGIN
r_test.a := 'Test';
dbms_output.put_line(r_test.a);
END;
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904910
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Ну так:


Ну так работает и с конструктором по умолчанию. Ты помедититируй инициализация и конструктор - кто курица а кто яйцо. Все что ты сэкономил это ():

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> DECLARE
  2    r_test test_obj := test_obj;
  3  BEGIN
  4    r_test.a := 'Test';
  5    dbms_output.put_line(r_test.a);
  6  END;
  7  /
Test

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904912
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNO
Я лох, признаю.

Что-то про вариант без скобок я вообще не подумал.

Писал с самого начала:
Код: plsql
1.
r_test test_obj := test_obj();


оно и не работало.

Спасибо.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39904931
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что ты сделал имеет смысл если у обьекта куча атрибутов, а с двумя:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> DECLARE
  2  r_test test_obj := test_obj(null,null);
  3  BEGIN
  4  r_test.a := 'Test';
  5  dbms_output.put_line(r_test.a);
  6  END;
  7  /
Test

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39905382
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
rpovarov
Инициализировать объект надо после BEGIN.
Бред.

А лучше ещё и комментарием в коде это пояснить, почему именно на этом месте. Иначе разные чудеса начинаются, когда потом кто-то начинает код менять и дополнять. Это из практики, к сожалению... человеческий фактор.

Два раза так меня дёргали, почему перестал код работать. А там, оказывается, кто-то из декларации перенёс инициализацию в код, но не туда (под if, например). Спрашиваешь человека зачем, а он говорит "непонятно, что за переменная, а тут я конструктор рядом поставил, и сразу видно". И хрен бы с ним, поставил и поставил. Но он его из декларации убрал, не удосужившись проверить, где тот ещё используется. Поэтому я теперь сразу после begin делаю огромный комментарий "инициализация переменных, не трогать" :) и там вкрячиваю конструктор. После этого его не двигали :)
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39905481
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpovarov
Поэтому я теперь сразу после begin делаю огромный комментарий "инициализация переменных, не трогать" :) и там вкрячиваю конструктор.
Теперь еще напиши коммент, чтобы саму декларацию не передвигали на после инициализации.
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39905518
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
rpovarov
Инициализировать объект надо после BEGIN.
Бред.
Есть разница, если автономка
...
Рейтинг: 0 / 0
Конструктор по умолчанию без параметров
    #39905580
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragraf
Есть разница, если автономка
И что? Из того как-то следует безапелляционное "надо"?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструктор по умолчанию без параметров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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