Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с package / 12 сообщений из 12, страница 1 из 1
27.04.2018, 11:16
    #39637237
Ixtiander06
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
сорри если глупый вопрос: впервые вожусь с package-ми, как-то раньше необходимости не было (в нашей конторе возможности оракла выходящие за рамки ANSI-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.
SQL> CREATE OR REPLACE PACKAGE PKG22 AS 
  2  
  3      TYPE PKG22_TAB11 IS RECORD (
  4        SF1 VARCHAR2(4),
  5        SF2 VARCHAR2(4),
  6        SF3 VARCHAR2(10)
  7      );
  8  
  9      TYPE T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;
 10  
 11       FUNCTION GET_TAB11_PE (
 12        VSKF1 IN VARCHAR2,
 13        VSKF2 IN VARCHAR2,
 14        VSKF3 IN VARCHAR2,
 15        VLF1 IN NUMBER,
 16        VLF2 IN NUMBER   
 17      ) RETURN T_PKG22_TAB11;
 18  
 19  END PKG22;
 20  /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY PKG22 AS 
  2  
  3    FUNCTION GET_TAB11_PE (
  4      VSKF1 IN VARCHAR2,
  5        VSKF2 IN VARCHAR2,
  6        VSKF3 IN VARCHAR2,
  7        VLF1 IN NUMBER,
  8        VLF2 IN NUMBER
  9    ) RETURN T_PKG22_TAB11  IS
 10  
 11      T T_PKG22_TAB11;
 12  
 13    BEGIN
 14  
 15     SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
 16     FROM TAB11  WHERE
 17    SKF1=VSKF1
 18    AND SKF2=VSKF2
 19    AND SKF3=VSKF3
 20    AND LD >= VLF1 AND LD <= VLF2;
 21    RETURN T;
 22    END GET_TAB11_PE;
 23  END PKG22;
 24  /
 
Package body created.



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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG'));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG'))
                    *
ERROR at line 1:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'GET_TAB11_PE'


SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 'aaa'));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 'aaa'))
                    *
ERROR at line 1:
ORA-00902: invalid datatype 


реагирует как и ожидалось. А теперь с правильными - и опаньки:

Код: plsql
1.
2.
3.
4.
5.
SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 22222));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 22222))
                    *
ERROR at line 1:
ORA-00902: invalid datatype 


В чем же дело? И главное ошибка ORA-00902 - такая же как при неправильном типе последнего аргумента, так что непонятно, что именно ему не нравится???
...
Рейтинг: 0 / 0
27.04.2018, 11:46
    #39637285
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Ixtiander06что именно ему не нравится???PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.
...
Рейтинг: 0 / 0
27.04.2018, 11:52
    #39637293
Ixtiander06
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
ElicIxtiander06что именно ему не нравится???PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.

спасибо! А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в SQL?
...
Рейтинг: 0 / 0
27.04.2018, 12:02
    #39637304
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Ixtiander06А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в SQL?RTFM Table Function Concepts (FAQ)
...
Рейтинг: 0 / 0
27.04.2018, 13:03
    #39637392
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Ixtiander06Elicпропущено...
PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.

спасибо! А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в 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.
SQL> CREATE OR REPLACE PACKAGE BODY PKG22 AS 
  2  
  3    FUNCTION GET_TAB11_PE (
  4      VSKF1 IN VARCHAR2,
  5        VSKF2 IN VARCHAR2,
  6        VSKF3 IN VARCHAR2,
  7        VLF1 IN NUMBER,
  8        VLF2 IN NUMBER
  9    ) RETURN T_PKG22_TAB11  IS
 10  
    str PKG22_TAB11 : = (null, null, null);
 11      T T_PKG22_TAB11 : = T_PKG22_TAB11(); 
 12  
 13    BEGIN
 14  
   for i in (SELECT DISTINCT SF1,SF2,SF3 
 16     FROM TAB11  WHERE
 17    SKF1=VSKF1
 18    AND SKF2=VSKF2
 19    AND SKF3=VSKF3
     AND LD >= VLF1 AND LD <= VLF2) loop
        str.SF1 := i.SF1;
      str.SF2 := i.SF2;
      str.SF3 := i.SF3;
      t.extend;
      t(t.last) := str;
    end loop;
 21    RETURN T;
 22    END GET_TAB11_PE;
 23  END PKG22;
...
Рейтинг: 0 / 0
27.04.2018, 13:15
    #39637413
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Fogelпримерный примерТы сделал то же самое, только используя говнокод.
...
Рейтинг: 0 / 0
27.04.2018, 13:36
    #39637430
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
ElicFogelпримерный примерТы сделал то же самое, только используя говнокод.
нет, не то же самое.
про говнокод - зато логика понятна, что делать.
...
Рейтинг: 0 / 0
27.04.2018, 13:38
    #39637434
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Fogelнет, не то же самое.То же, то же.
Fogelзато логика понятна,Нет там никакой логики. А поскольку то же, то всё рано работать не будет.
...
Рейтинг: 0 / 0
27.04.2018, 14:24
    #39637490
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
ElicFogelнет, не то же самое.То же, то же.
Fogelзато логика понятна,Нет там никакой логики. А поскольку то же, то всё рано работать не будет.
была, пока ты не пришёл ))
пришлось вспоминать.
Ixtiander06, для табличных функций на вход нужно курсор передавать, а не отдельные значения
или, что проще, потоковую функцию делать, типа такого:
Код: 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.
CREATE OR REPLACE PACKAGE PKG22 AS

  TYPE PKG22_TAB11 IS RECORD(
    SF1 VARCHAR2(4),
    SF2 VARCHAR2(4),
    SF3 VARCHAR2(10));

  TYPE T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;

  FUNCTION GET_TAB11_PE(VSKF1 IN VARCHAR2,
                        VSKF2 IN VARCHAR2,
                        VSKF3 IN VARCHAR2,
                        VLF1  IN NUMBER,
                        VLF2  IN NUMBER) RETURN T_PKG22_TAB11
    pipelined;

END PKG22;
/
CREATE OR REPLACE PACKAGE BODY PKG22 AS

  FUNCTION GET_TAB11_PE(VSKF1 IN VARCHAR2,
                        VSKF2 IN VARCHAR2,
                        VSKF3 IN VARCHAR2,
                        VLF1  IN NUMBER,
                        VLF2  IN NUMBER) RETURN T_PKG22_TAB11
    pipelined IS
  
  BEGIN
    for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop
      pipe row(i);
    end loop;
  END GET_TAB11_PE;
END PKG22;


PS: Elic наверняка ещё 20 с хвостиком способов знает, но фиг поделится.
...
Рейтинг: 0 / 0
27.04.2018, 14:33
    #39637499
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Fogel
Код: sql
1.
2.
3.
4.
5.
6.
for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop




Ты бы кофе попил...

SY.
...
Рейтинг: 0 / 0
27.04.2018, 14:36
    #39637501
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
SYFogel
Код: sql
1.
2.
3.
4.
5.
6.
for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop




Ты бы кофе попил...

SY.
копипаста, конечно без этого
...
Рейтинг: 0 / 0
27.04.2018, 15:31
    #39637552
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
непонятки с package
Ixtiander06,
А так не устроит?
Код: 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.
CREATE OR REPLACE
TYPE TARIFDBA.PKG22_TAB11 AS OBJECT (
SF1 VARCHAR2(4),
SF2 VARCHAR2(4),
SF3 VARCHAR2(10));
/
CREATE OR REPLACE
TYPE TARIFDBA.T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;
/
CREATE OR REPLACE PACKAGE TARIFDBA.PKG22 AS 
 
       FUNCTION GET_TAB11_PE RETURN T_PKG22_TAB11;
END PKG22;
/
CREATE OR REPLACE PACKAGE BODY TARIFDBA.PKG22 AS 
 
FUNCTION GET_TAB11_PE RETURN T_PKG22_TAB11  IS
  
      T T_PKG22_TAB11;
BEGIN
  WITH TAB AS
  (SELECT 'x' SF1, 'y' SF2,'z' SF3 from dual
   union 
   select 'dx' , 'dy' ,'dz' from dual)
  SELECT PKG22_TAB11(SF1,SF2,SF3) 
  BULK COLLECT INTO T
     FROM TAB ;
    RETURN T;
    END GET_TAB11_PE;
END PKG22;
/
select *
 from table (PKG22.GET_TAB11_PE)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с package / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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