powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Псевдофункция table.
18 сообщений из 18, страница 1 из 1
Псевдофункция table.
    #39447666
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
PROCEDURE relr(
    v_date    DATE,
    v_date2   DATE,
    v_inn varchar2)
AS
/*for v_inn's*/
  TYPE inn_list IS  TABLE OF VARCHAR2(25);
  l_data inn_list := inn_list();
  l_str LONG DEFAULT v_inn || ',';
  l_n NUMBER;

CURSOR t_data
    IS        
SELECT DISTINCT *
from table_a s
where
s.numnal IN (select column_name from table (l_data) )
;
BEGIN
/*for v_inn's*/
LOOP
    l_n := instr(l_str,',');
    EXIT  WHEN (NVL (l_n,0) = 0);
    l_data.extend;
    l_data(l_data.count):= ltrim(rtrim(SUBSTR(l_str,1,l_n-1)));
    l_str := SUBSTR (l_str, l_n + 1 );
  END LOOP;

.....

end relr;




при таком коде получаю ошибку
Код: plsql
1.
ORA-22905: cannot access rows from a non-nested table item



Знаю что псевдофункция TABLE не может использоваться с локально объявленным типом
коллекции, можно ли как-то обыграть такого плана говнокод, без создания типа уровня схемы?
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447674
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447798
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 12 оракле в пакете можно объявлять тип, и потом использовать его так как вы хотите.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447799
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlx,

К сожалению приходится пользоваться oracle 10g.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447835
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlx,
прикинь, в 11 тоже работает....))) хитро правда))

saxarock
ну так поставь 12.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447905
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vint,

Vintну так поставь 12.

Щаз пару бумажег согласую и поставлю.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447927
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List
sys.dbms_debug_vc2coll
KU$_VCNT

.....
stax
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447945
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению


Придется переосмыслить решение задачи.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447988
stax..saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List



И перепишите код, когда упретесь в ограничение 32к.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39447998
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больная мазольstax..saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List



И перепишите код, когда упретесь в ограничение 32к.

не совсем понял
SQL> desc sys.dbms_debug_vc2coll
sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000)

я список как пример привел,
возможно есть подходящие типы и в прикладной схеме

напр ANE_CHAR_TABLE

.....
stax
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448008
stax.., ну я имел ввиду ODCIVarchar2List.

ODCIVarchar2List
Stores varrays of VARCHAR2s

Datatype

VARRAY(32767) OF VARCHAR2(4000)
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448028
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больная мазольstax.., ну я имел ввиду ODCIVarchar2List.

ODCIVarchar2List
Stores varrays of VARCHAR2s

Datatype

VARRAY(32767) OF VARCHAR2(4000)
согласен, надо обращать внимание что за тип

но для IN 32К в 90% должно хватать

зы
удивляюсь что нет стандартных public типов
(аля sys_refcursor - тож кажись не было)

.....
stax
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448049
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больная мазольИ перепишите код, когда упретесь в ограничение 32к.В приведенном контексте более 16К значений не будет.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448417
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vintarlx,
прикинь, в 11 тоже работает....))) хитро правда))
правда? а я думал будет ошибка
Error: PLS-00642: локальные типы коллекций не допускаются в операторах SQL

Тут тоже говорят про ошибку.
Поделишься знанием как это работало в 11?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace package test is
	type t_type is table of number;
	function f_func return number;
end test;
/
create or replace package body test is
	function f_func return number is
		l number;
		t t_type := t_type();
	begin
		select rownum bulk collect into t from dual connect by level < 4;
		select count(1) into l from table(t);
		return l;
	end;
end test;
/
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448439
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlx,
pipelined function. Заполнение придумай сам.
Код: 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.
CREATE OR REPLACE PACKAGE DEV_INDICATOR IS
  TYPE tr_pipe_row IS RECORD(
     ID                      NUMBER);
  TYPE tt_pipe IS TABLE OF tr_pipe_row;
  /*-------------------------------------------------------------------------------------------------------------------------------------------------
  *-----------------------------------------------------------------------------------------------------------------------------------------------*/
  FUNCTION pipe_data(p_xml CLOB, p_oper_type VARCHAR2) RETURN tt_pipe
    PIPELINED;

END DEV_INDICATOR;
CREATE OR REPLACE PACKAGE BODY DEV_INDICATOR IS
  /*-----------------------------------------------------------------------------------------------------------------------------------------------*/
  FUNCTION pipe_data(p_xml CLOB, p_oper_type VARCHAR2) RETURN tt_pipe
    PIPELINED IS  
    pr_pipe          tr_pipe_row;
    pt_pipe          tt_pipe DEFAULT tt_pipe();
  BEGIN   
    /*-*/
    if pt_pipe.count > 0 then
      FOR i IN 1 .. pt_pipe.COUNT LOOP
        PIPE ROW(pt_pipe(i));
      END LOOP;
    end if;
  EXCEPTION
      when OTHERS then
      raise_application_error(-20000, dbms_utility.format_error_backtrace || ' error:' || SQLERRM);  
  END;
  /*-----------------------------------------------------------------------------------------------------------------------------------------------*/
END DEV_INDICATOR;

...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448443
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vint,

смысл уловил. спасибо)
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448597
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintpipelined functionЭто хоть и удобный, но всё же синтаксический сахар по сокрытию неявно создающихся типов уровня схемы.
...
Рейтинг: 0 / 0
Псевдофункция table.
    #39448633
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
кто бы спорил))) там же целых 3 объекта создается. и есть 2 типа ошибок когда оракл не может создать один из объектов, либо один из объектов был явно удалён. но представь у меня вся система так написана. потому что так исторически сложилось)))
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Псевдофункция table.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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