Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструктор по умолчанию без параметров / 17 сообщений из 17, страница 1 из 1
18.12.2019, 11:38
    #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
18.12.2019, 12:17
    #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
18.12.2019, 12:39
    #39904640
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
IMNO
Код: plsql
1.
2.
DECLARE 
  r_test test_obj;

Тут нет вызова никакого конструктора. Конструктор даже без параметров надо явно вызывать.
...
Рейтинг: 0 / 0
18.12.2019, 12:39
    #39904641
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
rpovarov
Инициализировать объект надо после BEGIN.
Бред.
...
Рейтинг: 0 / 0
18.12.2019, 13:02
    #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
18.12.2019, 13:06
    #39904684
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
IMNO
Код: plsql
1.
PLS-00307: too many declarations of "TEST_OBJ" match this call

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

Ты судорожно пытаешься "автоматизировать" то, чего не понимаешь. Почитай документацию сперва.
...
Рейтинг: 0 / 0
18.12.2019, 13:14
    #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
18.12.2019, 13:19
    #39904698
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
IMNO
Код: plsql
1.
2.
    SELF.a := NULL;            
    SELF.b := NULL;

Что случится, если убрать?
...
Рейтинг: 0 / 0
18.12.2019, 15:57
    #39904891
SY
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
18.12.2019, 16:01
    #39904899
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
Ну так:

авторDECLARE
r_test test_obj := test_obj();
BEGIN
r_test.a := 'Test';
dbms_output.put_line(r_test.a);
END;
...
Рейтинг: 0 / 0
18.12.2019, 16:07
    #39904910
SY
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
18.12.2019, 16:12
    #39904912
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
IMNO
Я лох, признаю.

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

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


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

Спасибо.
...
Рейтинг: 0 / 0
18.12.2019, 16:25
    #39904931
SY
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
19.12.2019, 11:57
    #39905382
rpovarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор по умолчанию без параметров
Elic
rpovarov
Инициализировать объект надо после BEGIN.
Бред.

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

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


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