Ошибка при создании процедуры Oracle - объявление пользовательского типа - PullRequest
1 голос
/ 24 ноября 2010

Я пытаюсь создать процедуру в Oracle Express Server (Application Express 2.1.0.00.39) с помощью веб-интерфейса.

Это SQL, который я запускаю с помощью опции SQL Commands в веб-интерфейсе

CREATE OR REPLACE PROCEDURE my_procedure (listOfNumbers num_list, 
                                          v_value varchar2)

IS

  PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

  UPDATE my_table
     SET my_column = v_value
   WHERE my_row_id IN (SELECT column_value 
                         FROM TABLE(listOfNumbers));

  COMMIT;

END;

UPDATE:

Изменено SELECT column_value FROM TABLE на SELECT column_value FROM TABLE(listOfNumbers), но теперь я получаю следующую ошибку:

PLS-00201: идентификатор 'num_list' должен быть объявленным

ОБНОВЛЕНИЕ 2:

Вот как я создал свой тип:

CREATE OR REPLACE TYPE  "num_list" as table of NUMBER(38,1)
/

Кажется, ошибка вызывается в строке объявления параметров:

(listOfNumbers num_list, v_value varchar2)

Ниже приведены сведения об объекте, отображаемые веб-интерфейсом Oracle Database Express Edition.

alt text

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Попробуйте ... TABLE(CAST(listOfNumbers AS num_list)).

Синтаксический анализатор SQL просто видит заполнитель связывания вместо listOfNumbers, и, поскольку это пользовательский тип, необходимо указать тип его.

Это будет работать, только если num_list определено как тип в схеме, а не просто объявлено как тип в блоке PL / SQL.

0 голосов
/ 24 ноября 2010

Видимо, я создавал тип с кавычками вокруг имени:

Следующие не работали :

CREATE OR REPLACE TYPE  "NUMBER_T" as table of NUMBER(38,1)

Когда я делал это без кавычеки затем создал процедуру, он смог ее распознать.

Следующее сработало :

CREATE OR REPLACE TYPE  NUMBER_T as table of NUMBER(38,1)

Я не уверен, почему, но это сработало.

0 голосов
/ 24 ноября 2010

Ваш код работает - при условии, что тип массива был объявлен правильно (см. Ниже). Поскольку у вас все еще есть проблема, я подозреваю, что именно здесь вы идете не так. Но вам нужно опубликовать код, который вы используете для создания типа NUM_LIST, чтобы мы могли его исправить.

Мои данные испытаний:

SQL> select * from my_table
  2  /

MY_COLUMN             MY_ROW_ID
-------------------- ----------
APC                           1
XYZ                           2
JFK                           3

SQL>

Чтобы использовать тип в выражении SQL, мы должны создать его как объект SQL:

SQL> create type num_list as table of number;
  2  /

Type created.

SQL>
SQL>
SQL> create or replace procedure my_procedure
  2      (listofnumbers num_list,
  3                    v_value varchar2)
  4  is
  5  begin
  6
  7    update my_table
  8       set my_column = v_value
  9     where my_row_id in (select column_value
 10                           from table(listofnumbers));
 11
 12  end;
 13  /

Procedure created.

SQL>

Выполнение процедуры:

SQL> declare
  2    n num_list := num_list(1,3);
  3  begin
  4    my_procedure (n , 'FOX IN SOCKS');
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>

И вот!

SQL> select * from my_table
  2  /

MY_COLUMN             MY_ROW_ID
-------------------- ----------
FOX IN SOCKS                  1
XYZ                           2
FOX IN SOCKS                  3

SQL>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...