Oracle СОЗДАЕТ ТИП и PL / SQL

#oracle #plsql

#Oracle #plsql

Вопрос:

У нас есть тип Oracle, который объявлен как таковой:

СОЗДАЙТЕ ИЛИ ЗАМЕНИТЕ ТИП its_accountarray;

Базового типа не существует. Этот тип затем используется в процедурах и пакетах (и в хранимых процедурах Java в качестве дескриптора массива). В процедуре / пакете используется функция extend для добавления в массив.

 <declare section>
    v_account latax.ITS_ACCOUNTARRAY := new ITS_accountArray();
...
BEGIN
    ...
    ...
    v_account.extend(1);
  

и в Java он используется как:
oracle.sql.ARRAY ls_accountARRAY, ls_periodARRAY;

 oracle.sql.ArrayDescriptor ad =   ArrayDescriptor.createDescriptor(**"ITS_ACCOUNTARRAY"**, oconn);

ls_accountARRAY = new ARRAY(ad, oconn, arg_accounts);
ocs.setARRAY(2, ls_accountARRAY);
  

Мне любопытно, как это работает. Хотя в имени есть Array, оно не определено как тип массива или таблицы, как я обычно вижу. Это работает, но является ли это законным использованием или я должен явно объявить тип как некоторый тип массива?

Спасибо

Sam

Комментарии:

1. Обновление: Я просто хочу исправить это для всех, кто сталкивается с этим вопросом: оказалось, что это просто проблема с отображением в версии Sqltools, которую я использовал. Когда я редактировал тип, он фактически частично отображал исходный код, поскольку CREATE OR REPLACE TYPE its_accountarray Это то, что меня зацепило. Часть тела » КАК ТАБЛИЦА ИЗ … » не отображалась; по-видимому, между ними было много пробелов, поэтому это тело не отображалось в поле зрения. Как я упоминал ниже, SQL * Plus отображался правильно. Новая версия инструмента работает лучше, по-прежнему с большим количеством встроенных пробелов, но, по крайней мере, в представлении.

Ответ №1:

Я попытался воспроизвести то, что, по вашим словам, происходит, и получил ошибку:

 CREATE OR REPLACE TYPE its_accountarray;

DECLARE
  v its_accountarray := its_accountarray();
BEGIN
  null;
END;
/

PLS-00311: the declaration of "ITS_ACCOUNTARRAY" is incomplete or malformed
  

Итак, вы, вероятно, смотрите на неправильное определение типа (например, вы смотрите на него в неправильной схеме) или не смотрите на определение типа целиком (например, есть ТЕЛО ТИПА, которое обеспечивает реализацию). Поскольку это, похоже, действует как тип вложенной таблицы, первое звучит более вероятно.

Комментарии:

1. Привет, Дэйв, спасибо, что так быстро ответил.

2. Привет, Дэйв, мне кажется, в прошлый раз я слишком быстро нажал ENTER. Вы правы!! Это объявление было неверным. Мне интересно, не ошибка ли это в инструменте, который я использовал (SQLTools 1.5). Когда я открыл тип в SQLTools, он показывал только эту часть, и у нее не было тела! Вот почему я был так сбит с толку. Я только что попытался описать ITS_ACCOUNTARRAY в sqlplus, он показывает, как ожидалось: SQL> describe ITS_ACCOUNTARRAY ITS_ACCOUNTARRAY TABLE OF VARCHAR2(24) Я использую SQLTools в течение нескольких лет, и это первый раз, когда это действительно меня зацепило. Еще раз большое спасибо. Sam