#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