powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непоследовательного заполнения коллекций
9 сообщений из 9, страница 1 из 1
непоследовательного заполнения коллекций
    #39400875
rekrabbe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В книге PL/SQL для профессионалов есть пример непоследовательного заполнения коллекции с использованием функции, в сигнатуре которой есть один параметр.
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
DROP TABLE hairstyles;

CREATE TABLE hairstyles (
   code INTEGER,
   description VARCHAR2(100)
   );

INSERT INTO hairstyles VALUES (1000, 'CREWCUT');
INSERT INTO hairstyles VALUES (1001, 'BOB');
INSERT INTO hairstyles VALUES (1002, 'SHAG');
INSERT INTO hairstyles VALUES (1003, 'BOUFFANT');
INSERT INTO hairstyles VALUES (1004, 'PAGEBOY');

CREATE OR REPLACE PACKAGE justonce
IS
   FUNCTION description (code_in IN hairstyles.code%TYPE)
      RETURN hairstyles.description%TYPE;
END justonce;
/

CREATE OR REPLACE PACKAGE BODY justonce
IS
   TYPE desc_t IS TABLE OF hairstyles.description%TYPE
      INDEX BY BINARY_INTEGER;
   descriptions   desc_t;

   FUNCTION description (code_in IN hairstyles.code%TYPE)
      RETURN hairstyles.description%TYPE
   IS
      return_value   hairstyles.description%TYPE;

      FUNCTION desc_from_database RETURN hairstyles.description%TYPE
      IS
         CURSOR desc_cur IS
            SELECT description FROM hairstyles WHERE code = code_in;
         desc_rec   desc_cur%ROWTYPE;
      BEGIN
         OPEN desc_cur;
         FETCH desc_cur INTO desc_rec;
         RETURN desc_rec.description;
      END;
   BEGIN
      RETURN descriptions (code_in);
   EXCEPTION
      WHEN NO_DATA_FOUND 
	  THEN
         descriptions (code_in) := desc_from_database;
         RETURN descriptions (code_in);
   END;
END justonce;
/

BEGIN
   DBMS_OUTPUT.PUT_LINE (justonce.description (1000));
   DBMS_OUTPUT.PUT_LINE (justonce.description (1002));
   DBMS_OUTPUT.PUT_LINE (justonce.description (1004));
END;
/


Вопрос как сделать тоже самое, если в сигнатуре функции 2 и более параметров? Непонятно какую коллекцию нужно будет использовать. Т.е. должно быть, что то типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN
      RETURN descriptions (code_in, param1_in, param2_in);
   EXCEPTION
      WHEN NO_DATA_FOUND 
	  THEN
         descriptions (code_in, param1_in, param2_in) := desc_from_database;
         RETURN descriptions (code_in, param1_in, param2_in);
   END;


Напишите возможно ли это и пример кода пожалуйста.
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39400896
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rekrabbeесли в сигнатуре функции 2 и более параметров?Коллекция коллекций.
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39400919
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rekrabbe,

хреновую книгу ты читаешь, imho
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39400926
rekrabbe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--rekrabbe,

хреновую книгу ты читаешь, imho
Какая получше будет? Официальная дока?
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39401058
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллекция записей
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39401069
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rekrabbe--Eugene--rekrabbe,

хреновую книгу ты читаешь, imho
Какая получше будет? Официальная дока?Самое лучшее что мне попадалось - Doing SQL from PL/SQL: Best and Worst Practices .
Правда у новичка может закипеть мозг.
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39402007
rekrabbe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Не получилось реализовать задуманное, создав коллекцию записей непонятно как вернуть данные из нее.
Создавал ее так:
Код: plsql
1.
2.
3.
4.
5.
6.
TYPE my_rec IS RECORD (
  r_code hairstyles.code%TYPE,
  r_grp hairstyles.grp%TYPE
);
TYPE my_array IS TABLE OF my_rec INDEX BY BINARY_INTEGER;
my_table my_array ;


Конструкция вида
Код: plsql
1.
RETURN my_table(my_rec(code_in, grp_in))


Не работает.
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39406451
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rekrabbe,

В такой реализации не получится, т.к. pl/sql таблица предполагает , что индекс уникальный. Если добавляются параметры, значит ключ должен уже быть составным. К примеру :
Код: 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.
CREATE OR REPLACE PACKAGE BODY justonce
IS
   TYPE desc_t IS TABLE OF hairstyles.description%TYPE
      INDEX BY BINARY_INTEGER;
   descriptions   desc_t;

   FUNCTION description (code_in IN hairstyles.code%TYPE,grp_in in hairstyles.grp%TYPE)
      RETURN hairstyles.description%TYPE
   IS
      return_value   hairstyles.description%TYPE;

      FUNCTION desc_from_database RETURN hairstyles.description%TYPE
      IS
         CURSOR desc_cur IS
            SELECT description FROM hairstyles WHERE code|| grp = code_in || grp_in ;
         desc_rec   desc_cur%ROWTYPE;
      BEGIN
         OPEN desc_cur;
         FETCH desc_cur INTO desc_rec;
         RETURN desc_rec.description;
      END;
   BEGIN
      RETURN descriptions (code_in || grp_in);
   EXCEPTION
      WHEN NO_DATA_FOUND
    THEN
         descriptions (code_in || grp_in) := desc_from_database;
         RETURN descriptions (code_in || grp_in);
   END;
END justonce;
...
Рейтинг: 0 / 0
непоследовательного заполнения коллекций
    #39430132
NetWeight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
drop table
HAIRSTYLES
/
create table
HAIRSTYLES
( grp          INTEGER
, code         INTEGER
, description  VARCHAR2( 100 )
)
/
insert into HAIRSTYLES values ( 1, 1000, 'CREWCUT')
/
insert into HAIRSTYLES values ( 1, 1001, 'BOB')
/
insert into HAIRSTYLES values ( 2, 1002, 'SHAG')
/
insert into HAIRSTYLES values ( 2, 1003, 'BOUFFANT')
/
insert into HAIRSTYLES values ( 3, 1004, 'PAGEBOY')
/

DECLARE
    type CODE_REC  is record ( description  HAIRSTYLES.description%type
                             ) ;
    type CODE_TBL  is table of CODE_REC index by BINARY_INTEGER;
    type GRP_REC   is record ( t_code  CODE_TBL
                             ) ;
    type GRP_TBL   is table of GRP_REC index by BINARY_INTEGER;
    t_grp          GRP_TBL;


    ----------------------------------------------------------------
    --    
    ----------------------------------------------------------------
    FUNCTION DESC_FROM_DATABASE
         ( i_grp                INTEGER
         , i_code               INTEGER
         )
    RETURN   HAIRSTYLES.description%type
    IS
        CURSOR desc_cur
        IS
            select description
              from HAIRSTYLES
             where 1    = 1
               and grp  = i_grp
               and code = i_code;

        desc_rec  desc_cur%rowtype;

    BEGIN
        BEGIN DBMS_OUTPUT.PUT_LINE( '    BEGIN: DESC_FROM_DATABASE' );

            open desc_cur;

            fetch desc_cur
             into desc_rec;

        DBMS_OUTPUT.PUT_LINE( '    END: DESC_FROM_DATABASE' ); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( '        DESC_FROM_DATABASE: EXCEPTION' ); RAISE;
        END;

        RETURN desc_rec.description;

    END DESC_FROM_DATABASE;


    ----------------------------------------------------------------
    --    
    ----------------------------------------------------------------
    FUNCTION DESC_FROM_TBL
         ( i_grp           INTEGER
         , i_code          INTEGER
         )
    RETURN   HAIRSTYLES.description%type
    IS
        v_return           HAIRSTYLES.description%type;

    BEGIN 
        BEGIN DBMS_OUTPUT.PUT_LINE( '    BEGIN: DESC_FROM_TBL' );

            v_return := t_grp( i_grp ).t_code( i_code ).description;

        DBMS_OUTPUT.PUT_LINE( '    END: DESC_FROM_TBL' );
        EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
                DBMS_OUTPUT.PUT_LINE( '        DESC_FROM_TBL: NO_DATA_FOUND' );
                RAISE NO_DATA_FOUND;

        END;

        RETURN v_return;

    END DESC_FROM_TBL;


    ----------------------------------------------------------------
    --    
    ----------------------------------------------------------------
    FUNCTION DESCRIPTION
        ( i_grp          HAIRSTYLES.grp%type
        , i_code         HAIRSTYLES.code%type
        )
    RETURN HAIRSTYLES.description%type
    IS
        v_return         HAIRSTYLES.description%type;

    BEGIN
        BEGIN DBMS_OUTPUT.PUT_LINE( 'BEGIN: DESCRIPTION' );

            DBMS_OUTPUT.PUT_LINE( '    i_grp  = ' || i_grp  );
            DBMS_OUTPUT.PUT_LINE( '    i_code = ' || i_code );

            BEGIN 
                v_return := DESC_FROM_TBL
                                ( i_grp  => i_grp
                                , i_code => i_code
                                ) ;

            EXCEPTION
                WHEN NO_DATA_FOUND 
                THEN
                    DBMS_OUTPUT.PUT_LINE( '    DESCRIPTION: EXCEPTION' );

                    t_grp( i_grp ).t_code( i_code ).description := DESC_FROM_DATABASE
                                                                       ( i_grp  => i_grp
                                                                       , i_code => i_code
                                                                       ) ;
                    v_return := DESC_FROM_TBL
                                    ( i_grp  => i_grp
                                    , i_code => i_code
                                    ) ;

            END;

            DBMS_OUTPUT.PUT_LINE( 'v_return = ' || v_return );

        DBMS_OUTPUT.PUT_LINE( 'END: DESCRIPTION' );
        END;

        RETURN v_return;

    END DESCRIPTION;


    ----------------------------------------------------------------
BEGIN
    DBMS_OUTPUT.PUT_LINE( DESCRIPTION( 1, 1000 ) );
    DBMS_OUTPUT.PUT_LINE( DESCRIPTION( 2, 1002 ) );
    DBMS_OUTPUT.PUT_LINE( DESCRIPTION( 3, 1004 ) );
    DBMS_OUTPUT.PUT_LINE( DESCRIPTION( 3, 1004 ) );

EXCEPTION
    WHEN OTHERS
    THEN
        RAISE;

END;

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


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