Pull to refresh

Comments 9

Зачет! Времени на это ушло, наверное, много…

Небольшие дополнения/правки от меня:
  • «Использование в SQL»: ассоциативные в 12c уже могут биндиться в SQL из PL/SQL если index by PLS_INTEGER:
    Link1
    Link2
  • Мне кажется, что надо уточнить то, что вы имели ввиду под "Не поддерживает DML-операции" у ассоциативных массивов. Я бы лучше сказал, что ассоциативные массивы, в отличие от varray и nested table, не могут храниться в таблицах.
  • У VARRAY метод DELETE() существует, но нет методов delete(m), delete(m,n)
  • «Индекс не может принимать значение null»зато может принимать пустой литерал ''
  • «Процедура DBMS_SESSION.FREE_UNUSED_USER_MEMORY возвращает неиспользуемую более память системе»не сразу и еще может быть полезно
Привет!
Спасибо за комменты и ссылки, немного подправил статью по ним.

В наших лекциях материал актуален для версии 11.2 – именно такая версия у нас на продуктиве и в ближайшие как минимум пару лет вряд ли будем апгрейдить. Возможно, позже запишем несколько презентаций по нововведениям версии 12с (заодно и сами ознакомимся).

По поводу «не поддерживает dml операции» — это фраза из документации «Cannot be manipulated with DML statements» :)

Про метод Delete у varray – отличное замечание, спасибо! Поправил в статье.

С пустой строкой в качестве индекса – тоже интересная деталь. Добавил в статью.

А инфа про процедуру DBMS_SESSION.FREE_UNUSED_USER_MEMORY добавлена в статью «факультативно». Тема с памятью (выделение/освобождение) уже ближе к админству и конкретно для меня туманна.В наших первых лекциях материал пока не настолько глубокий, чтобы в эту тему нырять. Может в будущем попробуем разобраться в вопросе.
Еще насчет column_value: все-таки для унификации желательнее использовать value(), тогда легко и однотипно можно работать с конкретным возвращаемым типом. Пример:
declare 
   cursor c1 is SELECT value(t) x FROM TABLE(ku$_objnumset(1)) t;
   cursor c2 is SELECT value(t) x FROM TABLE(ku$_objnumpairlist(ku$_objnumpair(10,20))) t;
begin
   for r in c1 loop
      dbms_output.put_line(r.x);
   end loop;
   for r in c2 loop
      dbms_output.put_line(r.x.num1);
   end loop;
end;
.
UFO just landed and posted this here
UFO just landed and posted this here
Кстати, очень показателен EXPAND_SQL для запроса с THE:
Исходный:
select value(c) x, the(select dummy from dual) x2 from the(select ku$_vcnt('RED2', 'GREEN2', 'BLUE2') x3 from dual) c

После трансформации:
SELECT "A1"."COLUMN_VALUE" "X"
      ,(SELECT "A3"."DUMMY" "DUMMY" FROM "SYS"."DUAL" "A3") "X2"
FROM  (
      SELECT VALUE(A4) "COLUMN_VALUE" 
      FROM TABLE(
                  (
                   SELECT "KU$_VCNT"('RED2','GREEN2','BLUE2') "X3" 
                   FROM "SYS"."DUAL" "A2"
                  )
                ) "A4"
      ) "A1"

Sign up to leave a comment.

Articles