2014-11-03 3 views
1

Я пытаюсь следующее:магазин ROWID в Oracle ОБЪЕКТА типа

CREATE TYPE T_TEST AS OBJECT (
    TEST_ROWID    ROWID, 
    TEST_DATA     NUMBER(12) 
); 
/

Но я получаю сообщение об ошибке:

ORA-24344: success with compilation error 
PLS-00530: Illegal type used for object type attribute: 'ROWID'. 

Я хочу, чтобы хранить RowId, потому что они быстрее, чем индекс поиска.

Что такое хороший способ достижения вышеуказанного? Кастинг до и от VARCHAR2, вероятно, принесет слишком много накладных расходов, используя индекс?

ответ

1

В определении вашего типа есть как минимум две ошибки.

Nonquoted identifiers cannot be Oracle SQL reserved words. Quoted identifiers can be reserved words, although this is not recommended.

Note: The reserved word ROWID is an exception to this rule. You cannot use the uppercase word ROWID, either quoted or nonquoted, as a column name. However, you can use the uppercase word as a quoted identifier that is not a column name, and you can use the word with one or more lowercase letters (for example, "Rowid" or "rowid") as any quoted identifier, including a column name.

Таким образом, вы не можете использовать ROWID в качестве имени переменной.

Во-вторых, вы не можете использовать тип ROWID. Если вы попробуете, вы получите PLS-00530

Как я знаю, функции CHARTOROWID/ROWIDTOCHAR могут помочь.

+0

К сожалению, первая ошибка является опечаткой. Он назывался 'TEST_ROWID' и' TEST_DATA', затем я удалил суффикс TEST, чтобы «улучшить чтение» ... Будет корректироваться. –

+0

@ davor Хорошо, какой индекс вы собираетесь использовать? Просто не применяйте функцию к индексированному столбцу – Multisync

+0

Вместо 'ROWID' я мог бы использовать первичный ключ таблицы (' NUMBER (20) '). –

Смежные вопросы