Variant conversion error for variable oracle

Learn the cause and how to resolve the ORA-06502 error message in Oracle. You tried to execute a statement that resulted in an arithmetic, numeric, string, conversion, or constraint error. The common reasons for this error are:

Learn the cause and how to resolve the ORA-06502 error message in Oracle.

Description

When you encounter an ORA-06502 error, the following error message will appear:

  • ORA-06502: PL/SQL: numeric or value error

Cause

You tried to execute a statement that resulted in an arithmetic, numeric, string, conversion, or constraint error.

The common reasons for this error are:

  1. You tried to assign a value to a numeric variable, but the value is larger than the variable can handle.
  2. You tried to assign a non-numeric value to a numeric variable and caused a conversion error.

Resolution

Let’s look at three options on how to resolve the ORA-06502 error:

Option #1 — Value too large

In our first option, this error occurs when you try to assign a value to a numeric variable, but the value is larger than the variable can handle.

For example, if you created a procedure called TestProc as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    v_number number(2);
  4  BEGIN
  5    v_number := 100;
  6  END;
  7  /

Procedure created.

This procedure was successfully created. But when we try to execute this procedure, we will get an ORA-06502 error as follows:

SQL> execute TestProc();
BEGIN TestProc(); END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at "EXAMPLE.TESTPROC", line 5
ORA-06512: at line 1

The first line of the error message (ie: ORA-06502) indicates the error that occurred, while the second line of the error message (ie: ORA-06512) indicates that the error occurred at line 5 of the PLSQL code.

In this example, you’ve tried to assign a 3 digit number to a variable called v_number that can only handle 2 digits. You could correct this error by redefining the v_number variable as number(3).

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    v_number number(3);
  4  BEGIN
  5    v_number := 100;
  6  END;
  7  /

Procedure created.

And now when we execute our TestProc procedure, the ORA-06502 error has been resolved.

SQL> execute TestProc();

PL/SQL procedure successfully completed.

Option #2 — Conversion error

In our second option, this error occurs if you are trying to assign a non-numeric value to a numeric variable.

For example, if you created a procedure called TestProc as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    v_number number(2);
  4  BEGIN
  5    v_number := 'a';
  6  END;
  7  /

Procedure created.

This procedure was successfully created. But when we try to execute this procedure, we will get an ORA-06502 error as follows:

SQL> execute TestProc();
BEGIN TestProc(); END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "EXAMPLE.TESTPROC", line 5
ORA-06512: at line 1

In this example, the value of ‘a’ does not properly convert to a numeric value. You can correct this error by assigning the variable called v_number a proper numeric value.

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    v_number number(2);
  4  BEGIN
  5    v_number := ASCII('a');
  6  END;
  7  /

Procedure created.

And now when we execute our TestProc procedure, the ORA-06502 error has been resolved.

SQL> execute TestProc();

PL/SQL procedure successfully completed.

Option #3 — Assigning NULL to a NOT NULL constrained variable

In our third option, this error occurs if you are trying to assign a NULL value to a NOT NULL constrained variable.

For example, if you created a procedure called TestProc as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS   
  3    v_non_nullable_variable VARCHAR2(30) NOT NULL := '5';
  4    v_null_variable         VARCHAR2(30)          := NULL;
  5  BEGIN
  6    v_non_nullable_variable := v_null_variable;
  7  EXCEPTION
  8    WHEN OTHERS THEN
  9      dbms_output.put_line(SQLERRM);
  10 END;
  11 /

Procedure created.

This procedure was successfully created. But when we try to execute this procedure, we will get an ORA-06502 error as follows:

ORA-06502: PL/SQL: numeric or value error

In this example, you can not assign a NULL value to the variable called v_non_nullable_variable. You can correct this error removing NOT NULL from the variable declaration of the v_non_nullable_variable as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS   
  3    v_non_nullable_variable VARCHAR2(30) := '5';
  4    v_null_variable         VARCHAR2(30) := NULL;
  5  BEGIN
  6    v_non_nullable_variable := v_null_variable;
  7  EXCEPTION
  8    WHEN OTHERS THEN
  9      dbms_output.put_line(SQLERRM);
  10 END;
  11 /

Procedure created.

Are you getting an ORA-06502 error message when working with Oracle SQL? Learn how to resolve it and what causes it in this article.

ORA-06502 Cause

The cause of the “ORA-06502 PL/SQL numeric or value error” can be one of many things:

  1. A value is being assigned to a numeric variable, but the value is larger than what the variable can handle.
  2. A non-numeric value is being assigned to a numeric variable.
  3. A value of NULL is being assigned to a variable which has a NOT NULL constraint.

Let’s take a look at the solutions for each of these causes.

The solution for this error will depend on the cause.

Let’s see an example of each of the three causes mentioned above.

Solution 1: Value Larger than Variable (Number Precision Too Large)

In this example, we have some code that is setting a numeric variable to a value which is larger than what can be stored.

Let’s create this procedure which declares and then sets a variable:

CREATE OR REPLACE PROCEDURE TestLargeNumber
AS
  testNumber NUMBER(3);
BEGIN
  testNumber := 4321;
END;

If we compile it, it compiles with no errors.

Procedure TESTLARGENUMBER compiled

Now, let’s run the procedure.

EXEC TestLargeNumber;

We get an error:

Error starting at line : 8 in command -
EXEC TestLargeNumber
Error report -
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at "SYSTEM.TESTLARGENUMBER", line 5
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

The error we’ve gotten is “ORA-06502: PL/SQL: numeric or value error: number precision too large”. It also includes an ORA-06512, but that error just mentions the next line the code is run from, as explained in this article on ORA-06512.

This is because our variable testNumber can only hold 3 digits, because it was declared as a NUMBER(3). But, the value we’re setting it to a few lines later is 4 digit long (4321).

So, the value is too large for the variable.

To resolve it, increase the size of your variable, or manipulate your value to fit the size of the variable (if possible).

In our example , we can change the size of the variable.

CREATE OR REPLACE PROCEDURE TestLargeNumber
AS
  testNumber NUMBER(4);
BEGIN
  testNumber := 4321;
END;
Procedure TESTLARGENUMBER compiled

Now, let’s run the procedure.

EXEC TestLargeNumber;
PL/SQL procedure successfully completed.

The procedure runs successfully. We don’t get any output (because we didn’t code any in), but there are no errors.

Read more on the Oracle data types here.

Solution 2: Non-Numeric Value

Another way to find and resolve this error is by ensuring you’re not setting a numeric variable to a non-numeric value.

For example, take a look at this function.

CREATE OR REPLACE PROCEDURE TestNonNumeric
AS
  testNumber NUMBER(4);
BEGIN
  testNumber := 'Yes';
END;
Procedure TESTNONNUMERIC compiled

The procedure compiles successfully. Now, let’s fun the function.

EXEC TestNonNumeric;
Error starting at line : 8 in command -
EXEC TestNonNumeric
Error report -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.TESTNONNUMERIC", line 5
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

The error we get is “ORA-06502: PL/SQL: numeric or value error: character to number conversion error”.

This happens because our variable testNumber is set to a NUMBER, but a few lines later, we’re setting it to a string value which cannot be converted to a number

To resolve this error:

  1. Ensure the value coming in is a number and not a string.
  2. Convert your string to a number using TO_NUMBER (the conversion might happen implicitly but this may help).
  3. Convert your string to the ASCII code that represents the string using the ASCII function.
  4. Change the data type of your variable (but check that your code is getting the right value first).

The solution you use will depend on your requirements.

Solution 3: NOT NULL Variable

This error can appear if you try to set a NULL value to a NOT NULL variable.

Let’s take a look at this code here:

CREATE OR REPLACE PROCEDURE TestNonNull
AS
  testNumber NUMBER(4) NOT NULL := 10;
  nullValue NUMBER(4) := NULL;
BEGIN
  testNumber := nullValue;
END;

Procedure TESTNONNULL compiled

Now, the reason we’re using a variable to store NULL and not just setting testNumber to NULL is because we get a different error in that case. Besides, it’s probably more likely that your NULL value will come from another system or a database table, rather than a hard-coded NULL value.

Let’s run this function now.

Error starting at line : 9 in command -
EXEC TestNonNull
Error report -
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYSTEM.TESTNONNULL", line 6
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

We get the ORA-06502 error.

This error message doesn’t give us much more information. But, we can look at the code on line 6, as indicated by the message. We can see we have a variable that has a NOT NULL constraint, and the variable is NULL.

To be sure, we can output some text in our demo when it is null.

CREATE OR REPLACE PROCEDURE TestNonNull
AS
  testNumber NUMBER(4) NOT NULL := 10;
  nullValue NUMBER(4) := NULL;
BEGIN
  IF (nullValue IS NULL) THEN
    dbms_output.put_line('Value is null!');
  ELSE
    testNumber := nullValue;
  END IF;
END;

Now let’s call the procedure.

EXEC TestNonNull;
Value is null!

The output shows the text message, indicating the value is null.

ORA-06502 character string buffer too small

This version of the error can occur if you set a character variable to a value larger than what it can hold.

When you declare character variables (CHAR, VARCHAR2, for example), you need to specify the maximum size of the value. If a value is assigned to this variable which is larger than that size, then this error will occur.

For example:

DECLARE
  charValue VARCHAR2(5);
BEGIN
  charValue := 'ABCDEF';
END;

If I compile this code, I get an error:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4

This happens because the variable is 5 characters long, and I’m setting it to a value which is 6 characters long.

You could also get this error when using CHAR data types.

DECLARE
  charValue CHAR(5);
BEGIN
  charValue := 'A';
  charValue := charValue || 'B';
END;
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 5

This error happens because the CHAR data type uses the maximum number of characters. It has stored the value of A and added 4 space characters, up until its maximum value of 5.

When you try to concatenate a value of B to it, the resulting value is ‘A    B’, which is 6 characters.

To resolve this, use a VARCHAR2 variable instead of a CHAR, and ensure the maximum size is enough for you.

ORA-06502: pl/sql: numeric or value error: null index table key value

Sometimes you might get this error message with the ORA-06502 error:

ORA-06502: pl/sql: numeric or value error: null index table key value

This means that either:

  • Your index variable is not getting initialized, or
  • Your index variable is getting set to NULL somewhere in the code.

Check your code to see that neither of these two situations are happening.

ORA-06502: pl/sql: numeric or value error: bulk bind: truncated bind

You might also get this specific error message:

ORA-06502: pl/sql: numeric or value error: bulk bind: truncated bind

This is caused by an attempt to SELECT, UPDATE, or INSERT data into a table using a PL/SQL type where a column does not have the same scale as the column in the table.

For example, you may have declared a variable in PL/SQL to be VARCHAR2(100), but your table is only a VARCHAR2(50) field. You may get this error then.

You may also get this error because some data types in PL/SQL have different lengths in SQL.

To resolve this, declare your variables as the same type as the SQL table:

type t_yourcol is table of yourtable.yourcol%TYPE;

So, that’s how you resolve the ORA-06502 error.

Lastly, if you enjoy the information and career advice I’ve been providing, sign up to my newsletter below to stay up-to-date on my articles. You’ll also receive a fantastic bonus. Thanks!

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

В PL/SQL Developere например есть отладчик процедур.

там оказалось что не с русскими буквами связано, а с цифрами.
видимо число не влазило в

v_n_reg_sa VARCHAR2 (20) := NULL;

увеличил на глаз до 24. Теперь работает.

> Почему то в XE по дефолту полуторнобайтовая кодировка врублена

> Вот эти параметры намекают мне, что у тебя по идее должна
> быть такая же проблема, если явно не указать размерность
> char

> Хотя я просто все символьные поля, кроме особых случаев,
> сделал по 4000 байт и забил. Так что по идее влезет все.

Решение московского пробника от 3 декабря | ЕГЭ 2023 по математике | Эйджей из Вебиума

>

А если бы лимит в Оракле был на 30000 байт ? 🙂

> А где ты это накопал ?

«The BYTE and CHAR qualifiers override the semantics specified by the NLS_LENGTH_SEMANTICS parameter, which has a default of byte semantics. For performance reasons, Oracle recommends that you use the NLS_LENGTH_SEMANTICS parameter to set length semantics and that you use the BYTE and CHAR qualifiers only when necessary to override the parameter»

> Звиняйте — у меня свой авторитет есть 🙂 Тем более он рулил
> проектом и я у него и спросил — делать так или не надо.
>

Авторитет авторитету люпус эст.

> Индексы составные поругались поначалу, он размер блока побольше
> сделал — и всех делов 🙂

> Я тоадом пользуюсь. он под ширину данных ширину колонки
> подгоняет

если там пара сотен тысяч записей.

> А разве жаба платная ?

Вообще-то да. Как и PL/SQL Developer.

Про жабу интересно написано:
«The Toad Freeware version may be used for a maximum of five (5) users within Licensee»s organization and expires each sixty (60) days, after which you will need to download and install the product again»
http://www.toadsoft.com/lic_agree.html

Источник: delphimaster.net

У вас проблема с слишком молодым буфером строки ошибок Pl / Sql Ora-06502

Вы можете получить сообщение об ошибке, указывающее, что мой буфер строки ошибок ora-06502 pl / sql слишком мал. Есть несколько способов решить эту проблему, и мы скоро разберемся с приложением.

Рекомендуется

ORA-06502: Числовая ошибка PL / SQL, с другой стороны, количественная ошибка: слишком маленький буфер символьной строки. Ошибка возникает, когда символьная строка длиннее по сравнению с объявленной температурной переменной. Длина каждой строки не должна превышать размер нашего собственного типа данных, объявленного в переменной.

Power Query Ошибки №3. Formula Firewall, запрос ссылается на…

ORA-06502: Числовая или значимая ошибка PL / SQL: слишком маленький числовой буфер. Ошибки возникают, когда расстояние строки местоположения превышает длину, относящуюся к этой конкретной объявленной символьной переменной. Разрыв строки не должен превышать размер типа захвата, объявленного в переменной.

Я тестировал все следующие различные методы кода, такие как удаление while и as well if, но когда я обслуживаю их вместе (if и while), я все равно получаю сообщение об ошибке с обоих концов …

номера справкиВключить вывод на серверNumero принимает причину «Введите № от 110 до 999:»Объяснять I число: равно 1; знак (25); udemrrrket Dynamics (1); c varchar2 (10); телефонный номер ;начинать Цельсия: = d: подразумевает длину (c); j: = подстрока (c, i, 1); написания цикла
ORA-06502: PL или SQL: числовое значение или просто ошибка: буфер символьного цикла слишком малORA-06512: на линии 1306502.00000 «PL на SQL: числовое значение или значение ошибки% s» зона

a varchar2 (2000);

ORA-06502: PL / SQL: число или ошибка: слишком мала строка strm. Ошибка возникает, если длина выполнения строки символов намного дороже, чем длина объявленного регулируемого стиля. Значение не может быть присвоено переменной should, если размер значения, передаваемого с базой данных, превышает размер этой объявленной переменной.

ORA-06502: PL / SQL: числовые, с другой стороны. Ошибка: строковый буфер со слишком маленьким значением, как правило, будет возвращен oracle. Эта ошибка возникает из-за того, что распознание вывода, хранящееся в этой переменной, длиннее, чем было объявлено.

Длина вашей текущей строки не должна превышать машину того типа данных, который объявлен для изменения. В этом конкретном случае строку часто можно сохранить в переменной. Если длина призрачной марки превышает указанный размер смещения, кабель больше нельзя будет сохранить. Если выполняется проверка для присвоения атрибутов апелляции, создается исключение.

Исключение

Ошибка описывается следующим образом. Номер выбора указывает на ошибку. Длина данных вместе с переменной больше, чем длина значения. Следующая ошибка произошла недавно.

void varchar2 (3);начинать пустой: = ‘A101’;Конец;Указатели ошибок -ORA-06502: числовой pl / sql: или ошибка цены: буфер строки духа слишком малORA-06512: строка 406502.00000 1. «PL / SQL: значение слишком числовая ошибка% s»

В трассировке стека ошибок можно увидеть две ошибки ORA. Рядом с вероятностью ошибки отображается первое предприятие с ошибкой. Вторая ошибка кода указывает, в какой строке обычно возникает ошибка. Ошибка свидетельствует о том, что размер строки деталей, учитываемых при анализе, больше не соответствует присвоенному ей значению.

Проблема

Рекомендуется

Ваш компьютер работает медленно? У вас проблемы с запуском Windows? Не отчаивайтесь! ASR Pro — это решение для вас. Этот мощный и простой в использовании инструмент проведет диагностику и ремонт вашего ПК, повысит производительность системы, оптимизирует память и повысит безопасность процесса.

Так что не ждите — скачайте ASR Pro сегодня!

  • 1. Скачать ASR Pro
  • 2. Следуйте инструкциям на экране, чтобы запустить сканирование.
  • 3. Перезагрузите компьютер и подождите, пока он завершит сканирование, а затем снова следуйте инструкциям на экране, чтобы удалить все вирусы, обнаруженные при сканировании компьютера с кодом ASR Pro.
  • Невозможно описать строку, если она намного длиннее, чем тип размера объявленной переменной веб-типа данных. В этом случае ошибка может повториться. Источник статистики пытается присвоить строку, чтобы убедиться, что вы указали номер. Будет выдана ошибка, если вы посчитаете, что строка содержит больше времени, чем ширина переменной.

    ora-06502. Буфер строки запроса на ошибку pl / sql слишком мал

    В следующей затруднительной ситуации важны четыре личности. В частности, переменная объявляется длиной в три символа. Длина строкового значения превышает размер типа объявленной переменной. ORA-06502: Ошибка PL / SQL: ошибка числа или значения: буфер строки роли мал, все равно будет отображаться, если значение привело к небольшой переменной.

    void varchar2 (3);начинать = пусто ‘A101’;Конец ;

    до свидания

    бесполезный varchar2 (3);начинать : = освободить ‘A101’;Конец;Страница ошибки -ORA-06502: PL / SQL: числовая ошибка или ошибка цены арены: строковый буфер слишком малORA-06512: на шпагате 406502.00000 3. PL / SQL: числовое значение или значение ошибки% s »

    Причина

    Произошла математическая, числовая, строковая, преобразовательная ошибка или, возможно, ошибка ограничения. Например, конкретная ошибка возникает, когда вы пытаетесь установить NULL, чтобы получить хорошую переменную, объявленную как NON NULL, или когда вы пытаетесь использовать внешние бюро для целого числа больше 99, чтобы помочь вам идентифицировать переменную с помощью NUMBER (2) оператор.

    Действие

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

    Уникальное решение

    Часть значения, переданного в Oracle PS./SQL, превышает размер, указанный для уникального символьного типа поиска. Чтобы воспользоваться этим, необходимо изменить тип типа данных. Общий вид символьного типа данных должен быть лучше. Если я хочу, чтобы размер моего дизайна данных репутации был максимальным, добавленным к типу данных, следует использовать другую сортировку диска, чтобы удовлетворить большую любовь.

    обнулить varchar2 (4);начинать пусто: = ‘A101’;Конец . . .

    выход

    Процедура PL / SQL успешно завершена.

    Двойное решение

    Очень важно стать широко известным благодаря ценному содержанию PL / SQL. Возможно, значение переменной было авторизовано некорректно и даже в одном методе произошла ошибка. После исправления значение be, безусловно, можно сохранить в переменной.

    varchar2 (4);начинать empid empid: указывает на «101»;Конец ;

    выход

    ora-06502 pl / sql error character string load too small

    Процедура PL / SQL успешно выполнена.

    Решение 3

    Во многих случаях присвоенное значение находится в определенном диапазоне объявленного типа данных. Размер значения регулярно достигает заявленного расстояния и ширины типа данных. В типичной ситуации мы не можем регулировать размер всех типов данных.

    Упущение необходимо исправить, а затем учесть в коде PL / SQL.

    обнулить varchar2 (3);начинать пусто: = ‘A101’;исключение ЕСЛИ ДРУГОЕ, ТО пустой: = 0;Конец . . .

    выход

    ora-06502 слишком маленький буфер строки аспекта ошибки pl / sql

    Транзакция PL / SQL завершена успешно.

    Как исправить слишком маленький буфер строки символов числовой или иногда значимой ошибки PL SQL?

    Сделайте так, чтобы вы могли SQL Designer (Инструменты / Настройки / База данных для NLS). Замените его на «СИМВОЛ».

    Как вы наверняка увидите, после изменения параметра плохие направляющие необходимо перекомпилировать, чтобы они стали «CHAR». Чтобы проверить, скомпилированы ли другие пакеты некорректно, воспользуйтесь этим запросом.

    Как исправить ошибку ORA-06502?

    Изменение числового значения на правильный диапазон цифр человека или изменение перехода на другой диапазон цифр, чтобы соответствовать значению, активирует ORA-06502.

    Как исправить слишком маленький буфер числовой строки PL SQL, а также символьной строки ошибки значения?

    Перейдите в помощь SQL Developer (Инструменты / Настройки / База данных и NLS). Замените его на «СИМВОЛ». Чтобы исправить эту конкретную основную проблему, вам необходимо перекомпилировать поврежденные пакеты после изменения конфигурации, чтобы убедиться, что у вас есть «CHAR». Чтобы увидеть, были ли другие инструменты скомпилированы неправильно, запустите этот раздел.

    Источник: computerblog.org

    ORA-06502: PL / SQL: ошибка числового значения или значения: слишком маленький буфер строки символов при вызове PLSQL

    Я начал получать сообщение об ошибке ниже, так как я добавил o_ID к процедуре, все работало нормально, пока я не добавил в o_ID это связано с o_ID быть установленным как неправильный тип данных возможно? Я просмотрел любые другие связанные темы на SO, но безрезультатно.

    o_ID изначально устанавливается, как показано ниже PR_LOAD_XML_FILE называется:

    $id = 0; $stmt->bindParam(‘o_ID’, $id);

    Из журналов

    2015-12-18T13:02:06+00:00 ERR (3): An exception occurred while executing ‘BEGIN PR_LOAD_XML_FILE ( i_XML => :i_XML, i_FILENAME => :i_FILENAME, o_ID => :o_ID, on_ErrorID => :on_ErrorID ); END;’ with params [«324420», «test.csv»]: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 1

    Процедура Spec

    PROCEDURE PR_LOAD_XML_FILE ( i_XML IN CLOB, i_FILENAME IN XML_DOC.FILENAME%TYPE, o_ID OUT NUMBER, on_ErrorID OUT INTEGER );

    Тело процедуры

    PROCEDURE PR_LOAD_XML_FILE ( i_XML IN CLOB, i_FILENAME IN XML_DOC.FILENAME%TYPE, o_ID OUT NUMBER, on_ErrorID OUT INTEGER ) IS doc_id XML_DOC.id%TYPE; xml XMLTYPE; BEGIN . END PR_LOAD_XML_FILE;

    Решение

    Я думаю, что когда вы вызываете свою процедуру, вы устанавливаете переменную для получения значения o_ID в виде строки. Вот мой пакет, который издевается над твоим:

    CREATE OR REPLACE PACKAGE PKG_PR_LOAD_XML_FILE AS PROCEDURE PR_LOAD_XML_FILE ( i_XML IN CLOB, i_FILENAME IN varchar2, o_ID OUT NUMBER, on_ErrorID OUT INTEGER ); END PKG_PR_LOAD_XML_FILE; / CREATE OR REPLACE PACKAGE BODY PKG_PR_LOAD_XML_FILE AS PROCEDURE PR_LOAD_XML_FILE ( i_XML IN CLOB, i_FILENAME IN varchar2, o_ID OUT NUMBER, on_ErrorID OUT INTEGER ) IS BEGIN dbms_output.put_line( ‘i_XML: ‘||i_XML ); dbms_output.put_line( ‘i_FILENAME: ‘||i_FILENAME ); o_ID := 999999; on_ErrorID := 123456789; END PR_LOAD_XML_FILE; END PKG_PR_LOAD_XML_FILE; /

    В SQL * Plus я сначала определю эти две переменные связывания. Обратите внимание, что для переменной bind v_o_ID установлено значение varchar2 (4). Это предназначено для потерпеть поражение потому что значение o_ID установлено в 999999 в процедуре, которая длиннее 4 символов (если значение o_ID было установлено равным 9999, что составляет 4 символа или менее, то вызов процедуры работал бы нормально, но ошибка все равно будет присутствовать, и будет появляться Вы, как только значение o_ID станет больше 4 символов):

    SQLPlus> var v_o_ID varchar2(4) SQLPlus> var v_on_ErrorID number

    Теперь я вызываю процедуру в SQL * Plus, и она будет потерпеть поражение:

    SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( », ‘heresfilename.csv’, :v_o_ID, :v_on_ErrorID); ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 1

    Теперь я установлю переменную связывания v_o_ID в число, и вызов процедуры будет успех. Вы можете увидеть полученные значения из процедуры, если вы печатаете переменные связывания, используя print команда:

    SQLPlus> var v_o_ID number SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( », ‘heresfilename.csv’, :v_o_ID, :v_on_ErrorID); i_XML: i_FILENAME: heresfilename.csv PL/SQL procedure successfully completed. SQLPlus> print v_o_ID V_O_ID ———- 999999 SQLPlus> print v_on_ErrorID V_ON_ERRORID ———— 123456789

    Другие решения

    Других решений пока нет …

    Источник: web-answers.ru

    ORA-06502: PL / SQL: ошибка с числом или значением при конкатенации

    Это терпит неудачу, потому что выражение построено слева направо, и вы не можете добавить 2 в строку ‘Result: 2’ .

    Это работало бы с умножением или делением, потому что арифметическое превосходство заставляет те операции быть оцененными сначала.

    begin dbms_output.put_line(‘Result ‘ || 2 / 2); end; / Result 1 PL/SQL procedure successfully completed.

    Чтобы это работало для любой операции, вам нужно заключить в скобки выражение:

    begin dbms_output.put_line(‘Result ‘ || (2 + 2)); end; / Result 4 PL/SQL procedure successfully completed.

    Просто добавьте, что проще писать переменные хоста / связывания без пробела после : , например :myvar , а не : myvar .

    William Robertson 25 Июл 2020 в 07:51

    Вы не видите ошибку sqldeveloper, вы получаете ошибку при выполнении оператора sql в sqldeveloper, это что-то совсем другое. Для простоты я объявляю переменные в моем примере вместо использования переменных связывания, как вы:

    DECLARE a NUMBER; b NUMBER; BEGIN a := 1; b := 2; DBMS_OUTPUT.PUT_LINE(‘sum = ‘||a+b); END;

    Возвращает ORA-06502: PL / SQL: ошибка числа или значения: ошибка преобразования символа в число ORA-06512: в строке 7 Важной информацией является строка 7. Что-то не так в этом операторе dbms_output, и причина — приоритет оператора. Лучше всего сообщить ядру базы данных, что вы хотите, чтобы число соединялось со строкой, ошибка указывает, что происходит неявное преобразование.

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

    DECLARE a NUMBER; b NUMBER; BEGIN a := 1; b := 2; DBMS_OUTPUT.PUT_LINE(‘sum = ‘|| TO_NUMBER(a+b)); END;

    Еще одно замечание. Этот синтаксис

    a :=: a;

    Работает, но очень сбивает с толку. Я бы использовал более описательное имя для вашей переменной связывания и отделил бы оператор присваивания := от переменной связывания. Писать это так гораздо удобнее:

    a := :variablea;

    Источник: question-it.com

    ORA-06502 means that PL/SQL engine cannot convert a character-typed string into a number or a subset of arithmetic for overall evaluation. Mostly, it’s because of the following problems:

    1. Numeric Type Conversion
    2. Numeric Operator Precedence

    A. Numeric Type Conversion

    ORA-06502 tells you that PL/SQL engine cannot convert a string into a number. Which means, an arithmetic, numeric, string, conversion, or constraint error occurred. Let’s see a normal case first.

    SQL> set serveroutput on;
    SQL> declare
      2    v_num number;
      3  begin
      4    v_num := 123;
      5    dbms_output.put_line('The number is ' || v_num);
      6  end;
      7  /
    The number is 123

    PL/SQL procedure successfully completed.

    A number 123 is assigned to variable V_NUM which accept only NUMBER type. So there’s no conversion needed. But what if we assign a string to the variable?

    SQL> declare
      2    v_num number;
      3  begin
      4    v_num := '123';
      5    dbms_output.put_line('The number is ' || v_num);
      6  end;
      7  /
    The number is 123

    PL/SQL procedure successfully completed.

    As you can see, PL/SQL engine converted the string into a number, then assigned it into the variable.

    Now, let’s try some basic arithmetic expressions.

    SQL> declare
      2    v_num number;
      3  begin
      4    v_num := 2 + 2;
      5    dbms_output.put_line('The number is ' || v_num);
      6  end;
      7  /
    The number is 4

    PL/SQL procedure successfully completed.

    OK, the variable accepts value, the result of evaluation, no ORA-06502. What if we use it as a string?

    SQL> declare
      2    v_num number;
      3  begin
      4    v_num := '2 + 2';
      5    dbms_output.put_line('The number is ' || v_num);
      6  end;
      7  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 4

    PL/SQL engine tried to convert the string into a number, but it failed with ORA-06502. This time, V_NUM cannot accept the result.

    The solution to this type of error is to avoid implicit type conversion if possible.

    B. Numeric Operator Precedence

    To better understand ORA-06502, let’s see a more advanced topic about operator precedence in Oracle database. In the following example, we tried to output a string that concatenate an arithmetic.

    SQL> begin
      2    dbms_output.put_line('The number is ' || 2 + 2);
      3  end;
      4  /
    begin
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 2

    ORA-06502 was thrown eventually. Since || (concatenation) and + (addition) operators are at the same level of operator precedence, PL/SQL engine will evaluate them in the order of presence.

    First, it concatenated «The number is » and «2» into «The number is 2», which was successful, but when it tried to add the last value «2», it failed to convert the former string into a number and threw ORA-06502.

    Solutions

    1. Rearrange the Output

    We should make PL/SQL engine deal with the numeric evaluation first, then the concatenation by rearranging the output.

    SQL> begin
      2    dbms_output.put_line(2 + 2 || ' is the number.');
      3  end;
      4  /
    4 is the number.

    PL/SQL procedure successfully completed.

    This time, the expression is good because the order of presence of operators has been changed.

    2. Override Operator Precedence

    Beside rearranging the order of presence, how can we make the latter take the precedence over the former to fix the problem? Here is the trick for our PL/SQL block of codes.

    SQL> begin
      2    dbms_output.put_line('The number is ' || (2 + 2));
      3  end;
      4  /
    The number is 4

    PL/SQL procedure successfully completed.

    As you can see, we used a parenthesis to override operator precedence. The evaluation will start from the highest precedence which is 2 + 2 numeric value inside the parentheses to the rest according to their operator precedence defined in Oracle. This is how we escape from ORA-06502.

    In PL/SQL, if multiple parentheses are used in your expression, the evaluation will start from the inner to the outer.

    A very similar error that you might see in your statements is ORA-01722: invalid number, which is also related to conversion issues of numeric values.


    ORA-06502: PL/SQL: numeric or value errorstring
    Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).
    Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.

    Reference: http://docs.oracle.com/cd/B28359_01/server.111/b28278/e4100.htm#sthref1889

    ORA-06502 exception occurs when arithmetic, numeric, string, conversion, or constraint error occurred. In my views, ORA-06502 normally occurs because of programming bugs and programmer ignorance.

    ORA-06502 exception raises by the Oracle Database when:
    — We try to assign a larger value a variable can hold
    — We try to assign a string to a number type variable
    — We try to assign NULL to variable declared as NOT NULL

    Examples:

    SQL> declare
      2     n number(2);
      3  begin
      4     n := 123;
      5  end;
      6  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: number precision too large
    ORA-06512: at line 4
    

    SQL> declare
      2     n number(2);
      3  begin
      4     n := 'test';
      5  end;
      6  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 4
    

    SQL> declare
      2     str varchar2(3);
      3  begin
      4     str := 'test';
      5  end;
      6  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 4
    

    SQL> declare
      2     n1 number not null := 1;
      3     n2 number;
      4  begin
      5     n1 := n2;
      6  end;
      7  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at line 5
    

    Related Posts:
    — ORA-06502: invalid LOB locator specified
    — ORA-01460 unimplemented or unreasonable conversion requested
    — ORA-01723: zero-length columns are not allowed
    — ORA-01489: result of string concatenation is too long
    — ORA-01722: invalid number
    — ORA-00911: invalid character
    — ORA-00904: invalid identifier

     
    SergP ©
     
    (2006-11-13 13:04)
    [0]

    В чем может быть причина такой ошибки?

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    И где можно увеличить этот character string buffer?


     
    Sergey13 ©
     
    (2006-11-13 13:10)
    [1]

    ORA-06502 PL/SQL: numeric or value errorstring

    An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

    Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.


     
    Desdechado ©
     
    (2006-11-13 13:14)
    [2]

    s VARCHAR2(10):=»123456789012345″;


     
    SergP ©
     
    (2006-11-13 13:27)
    [3]

    Понял…
    Теперь как бы найти в каком месте это происходит, а то процедура большая, а в логе выводится только номер строки где raise стоит…


    ...
      EXCEPTION
         WHEN OTHERS
         THEN
            RAISE;
      END;


     
    Sergey13 ©
     
    (2006-11-13 13:30)
    [4]

    > [3] SergP ©   (13.11.06 13:27)

    В PL/SQL Developere например есть отладчик процедур.


     
    Desdechado ©
     
    (2006-11-13 13:32)
    [5]

    смысл такого
    EXCEPTION
        WHEN OTHERS
        THEN
           RAISE;
     END;

    обработчика?
    без него тебе бы и строку показало


     
    ANB ©
     
    (2006-11-13 13:34)
    [6]


    > SergP ©   (13.11.06 13:27) [3]

    Хех. Известный косяк. Сохраняй на всех перехватах исключений ее трассировку. так сможешь найти место ошибки. И сделай все варчаровые переменные подлиннее. Оракл сильно от этого не напряжется. Кстати, возможный вариант, из-за чего может появится ошибка :
    имеем S varchar2(10). S := «Вася123456»; На 10-ке (XE) вполне вероятна ошибка невлезания, т.к. русские буквы занимают по 2 байта. Лечится заменой varchar2(10) на varchar2(10 char)


     
    SergP ©
     
    (2006-11-13 13:49)
    [7]

    Спасибо… Убрал этот обработчик и нашел где…


     
    Desdechado ©
     
    (2006-11-13 13:52)
    [8]

    > русские буквы занимают по 2 байта
    Это если NVARCHAR2 пытаться туда запихнуть. Или нет?


     
    SergP ©
     
    (2006-11-13 14:01)
    [9]

    > [8] Desdechado ©   (13.11.06 13:52)
    > > русские буквы занимают по 2 байта
    > Это если NVARCHAR2 пытаться туда запихнуть. Или нет?

    там оказалось что не с русскими буквами связано, а с цифрами…
    видимо число не влазило в

    v_n_reg_sa         VARCHAR2 (20)  := NULL;

    увеличил на глаз до 24. Теперь работает.


     
    ANB ©
     
    (2006-11-13 14:15)
    [10]


    > Это если NVARCHAR2 пытаться туда запихнуть. Или нет?

    Не. Просто константу. Причем на 9-ке с этим проблем не было.


     
    SergP ©
     
    (2006-11-13 15:24)
    [11]

    > [9] SergP ©   (13.11.06 14:01)
    >
    > увеличил на глаз до 24. Теперь работает.

    Блин. Разработчики редиски… Сегодня прислали версию, вместо той что раньше прислали… Посмотрел, а они там уже сами увеличили размеры переменных. А я часа 1,5-2 потратил на поиск этих «багов»….


     
    Desdechado ©
     
    (2006-11-13 16:09)
    [12]

    разработчиков [5] — строем за метлами

    > Не. Просто константу. Причем на 9-ке с этим проблем не было.
    В какой кодировке создавалась БД? В какой кодировке схема? Может, умолчания изменились?


     
    k2 ©
     
    (2006-11-13 16:12)
    [13]

    Desdechado ©   (13.11.06 16:09) [12]
    для nls_length_semantics умолчание изменилось вроде:
    в 9-ке-char, в 10-ке-byte


     
    ANB ©
     
    (2006-11-13 16:13)
    [14]


    > Desdechado ©   (13.11.06 16:09) [12]

    ЭЭЭЭ. Просто пнули XE она сама все поставила. Не задавая лишних вопросов. Хотя, в принципе, указание размерности никому не мешает, зато код будет работать при любой настройке базы.


     
    Игорь Шевченко ©
     
    (2006-11-13 16:26)
    [15]


    > Хотя, в принципе, указание размерности никому не мешает,
    >  зато код будет работать при любой настройке базы.

    А вот гады пишут, что лучше nls_length_semantics устанавливать, а саму семантику в объявлениях только при крайней нужде менять. Оно говорят портабельнее получается. Домены бы в Оракл — цены б ему не было.


     
    Desdechado ©
     
    (2006-11-13 16:32)
    [16]

    Да, доменов мне не хватает…

    k2 ©   (13.11.06 16:12) [13]
    На своей 9-ке проверил (умолчания не трогали) — BYTE. И на линухе, и на выни.


     
    k2 ©
     
    (2006-11-13 16:35)
    [17]

    Desdechado ©   (13.11.06 16:32) [16]
    знач наврала сорри, у меня это запросто :)


     
    ANB ©
     
    (2006-11-13 16:43)
    [18]


    > Desdechado ©   (13.11.06 16:32) [16]

    Не, это из-за кодировки. Почему то в XE по дефолту полуторнобайтовая кодировка врублена (не помню как она называется, однако dump хорошо это показывает).


     
    Игорь Шевченко ©
     
    (2006-11-13 17:21)
    [19]

    ANB ©   (13.11.06 16:43) [18]


    > Почему то в XE по дефолту полуторнобайтовая кодировка врублена

    А это я вполне могу вечером посмотреть, стоит XE с кодировкой по умолчанию. XE юникодный (XEUniv)


     
    Игорь Шевченко ©
     
    (2006-11-13 22:55)
    [20]

    В XE без всяких исправлений, как было, так и встало.

    NLS_LANGUAGE               AMERICAN

          NLS_TERRITORY              AMERICA

              NLS_CURRENCY               $      

                                      NLS_ISO_CURRENCY           AMERICA

             NLS_NUMERIC_CHARACTERS     .,    

              NLS_CHARACTERSET           AL32UTF8

              NLS_CALENDAR               GREGORIAN

              NLS_DATE_FORMAT            DD-MON-RR

              NLS_DATE_LANGUAGE          AMERICAN

              NLS_SORT                   BINARY

              NLS_TIME_FORMAT            HH.MI.SSXFF AM

              NLS_TIMESTAMP_FORMAT       DD-MON-RR HH.MI.SSXFF AM

              NLS_TIME_TZ_FORMAT         HH.MI.SSXFF AM TZR

              NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR

              NLS_DUAL_CURRENCY          $

              NLS_COMP                   BINARY

              NLS_LENGTH_SEMANTICS       BYTE

              NLS_NCHAR_CONV_EXCP        FALSE

              NLS_NCHAR_CHARACTERSET     AL16UTF16

              NLS_RDBMS_VERSION          10.2.0.1.0


     
    ANB ©
     
    (2006-11-14 10:37)
    [21]

    NLS_CHARACTERSET           AL32UTF8
    NLS_LENGTH_SEMANTICS       BYTE
    NLS_NCHAR_CHARACTERSET     AL16UTF16

    Вот эти параметры намекают мне, что у тебя по идее должна быть такая же проблема, если явно не указать размерность char


     
    Игорь Шевченко ©
     
    (2006-11-14 11:09)
    [22]

    ANB ©   (14.11.06 10:37) [21]


    > Вот эти параметры намекают мне, что у тебя по идее должна
    > быть такая же проблема, если явно не указать размерность
    > char

    Безусловно. Я указываю char в объявлении полей, когда допускаю, что в полях будут находиться символы, отличные от #0-#127, а гады говорят, что надо устанавливать nls_length_semantics для базы, а в объявлениях ничего не трогать.


     
    ANB ©
     
    (2006-11-14 11:18)
    [23]


    > Игорь Шевченко ©   (14.11.06 11:09) [22]

    Уй млин. А мы в базе не стали указывать. Только в хранимках. Хотя я просто все символьные поля, кроме особых случаев, сделал по 4000 байт и забил. Так что по идее влезет все.


     
    ANB ©
     
    (2006-11-14 11:19)
    [24]


    > а гады говорят, что надо устанавливать nls_length_semantics
    > для базы

    А где ты это накопал ?


     
    Игорь Шевченко ©
     
    (2006-11-14 11:45)
    [25]

    ANB ©   (14.11.06 11:18) [23]


    > Хотя я просто все символьные поля, кроме особых случаев,
    >  сделал по 4000 байт и забил. Так что по идее влезет все.
    >

    А если бы лимит в Оракле был на 30000 байт ? :)


    > А где ты это накопал ?

    В доке, вестимо

    «The BYTE and CHAR qualifiers override the semantics specified by the NLS_LENGTH_SEMANTICS parameter, which has a default of byte semantics. For performance reasons, Oracle recommends that you use the NLS_LENGTH_SEMANTICS parameter to set length semantics and that you use the BYTE and CHAR qualifiers only when necessary to override the parameter«

    «Oracle® Database SQL Reference
    10g Release 1 (10.1)
    Part Number B10759-01″


     
    ANB ©
     
    (2006-11-14 11:57)
    [26]


    > А если бы лимит в Оракле был на 30000 байт ? :)

    Ну и сделал бы столько :) На размер БД это не влияет. Они же варчаровые.

    Спасибо за ссылку.


     
    Игорь Шевченко ©
     
    (2006-11-14 12:16)
    [27]


    > Ну и сделал бы столько :) На размер БД это не влияет. Они
    > же варчаровые.

    Наверное ты Celko не читал…А зря, он как раз очень аргументированно возражает против такого бездумного назначения максимального размера полям.
    Рекомендую: http://www.mini-mag.ru/?cid=2170&tov=163372


     
    ANB ©
     
    (2006-11-14 12:20)
    [28]


    > Рекомендую: http://www.mini-mag.ru/?cid=2170&tov=163372

    Тьфу, млин. Это ссылка на магазин.
    Звиняйте — у меня свой авторитет есть :) Тем более он рулил проектом и я у него и спросил — делать так или не надо. Индексы составные поругались поначалу, он размер блока побольше сделал — и всех делов :)


     
    k2 ©
     
    (2006-11-14 12:24)
    [29]

    и мы даже знаем кто :)
    только Селко наверное тож пару раз проектами рулил :)


     
    Игорь Шевченко ©
     
    (2006-11-14 12:59)
    [30]

    ANB ©   (14.11.06 12:20) [28]


    > Звиняйте — у меня свой авторитет есть :) Тем более он рулил
    > проектом и я у него и спросил — делать так или не надо.
    >

    Авторитет авторитету люпус эст.


    > Индексы составные поругались поначалу, он размер блока побольше
    > сделал — и всех делов :)

    Особенно в SQL*Plus удобно запросы с такими полями делать…


     
    ANB ©
     
    (2006-11-14 13:04)
    [31]


    > Особенно в SQL*Plus удобно запросы с такими полями делать.
    > ..

    Я тоадом пользуюсь. он под ширину данных ширину колонки подгоняет


     
    Игорь Шевченко ©
     
    (2006-11-14 13:12)
    [32]

    ANB ©   (14.11.06 13:04) [31]


    > Я тоадом пользуюсь. он под ширину данных ширину колонки
    > подгоняет

    если там пара сотен тысяч записей…

    Кроме того, извини, когда жаба будет поставляться в дистрибутиве оракла, тогда имеет смысл говорить, что ты ей пользуешься и всем рекомендуешь. Тора, она хоть бесплатная, но тормозная, а жаба денег стоит и потому давит.
    Вот и остается SQL*Plus


     
    ANB ©
     
    (2006-11-14 15:48)
    [33]


    > Вот и остается SQL*Plus

    Есть еще pl/sql девелопер, склнафигатор (жуткая гадость).
    А разве жаба платная ?


     
    Игорь Шевченко ©
     
    (2006-11-14 16:18)
    [34]

    ANB ©   (14.11.06 15:48) [33]


    > А разве жаба платная ?

    Вообще-то да. Как и PL/SQL Developer.

    Про жабу интересно написано:
    «The Toad Freeware version may be used for a maximum of five (5) users within Licensee»s organization and expires each sixty (60) days, after which you will need to download and install the product again»
    http://www.toadsoft.com/lic_agree.html

    Насколько я знаю, бесплатная TORA ну и SQL*Plus :)


     
    k2 ©
     
    (2006-11-14 16:40)
    [35]

    ANB ©   (14.11.06 13:04) [31]
    Андрей, а твоя жаба оракловые пакеты понимает на десятке? и какая тогда версия?


     
    Val ©
     
    (2006-11-14 17:02)
    [36]

    >[15] Игорь Шевченко ©   (13.11.06 16:26)
    >..Домены бы в Оракл — цены б ему не было.
    да вроде %TYPE неплохо справляется…


     
    ANB ©
     
    (2006-11-14 17:08)
    [37]


    > Вообще-то да. Как и PL/SQL Developer.

    Млин. А я и не знал. Фришную версию не ставлю — она кривая. А так у меня ключ есть. Пока подходит.


    > Андрей, а твоя жаба оракловые пакеты понимает на десятке?
    >  и какая тогда версия?

    Старая жаба вообще отказалась работать с 10-кой. Ща у меня 8-я версия. Вроде проблем нету особых. Нарывался на глюк в 9-ке — здоровые пакеты с отладкой не хотели компиляться. Пришлось их девелопером компилять.


     
    k2 ©
     
    (2006-11-14 17:20)
    [38]

    у меня 8.0.0.47 категорически отказывается просматривать в 10-ке процедуры , функции и спецификацию пакета, хотя боди и просматривает и редактировать и компилить пожалуйста, такая загогулина :-/


     
    ANB ©
     
    (2006-11-14 17:30)
    [39]


    > k2 ©   (14.11.06 17:20) [38]

    Упс. И у меня такой же. Хотя я на живой 10-ке его не гонял — только на XE. Свежее версии нету ? Вполне возможно, что в этой не выгребли все баги. Таки 7-ка вообще не умела работать с ораклом 10, даже XE.


     
    k2 ©
     
    (2006-11-14 17:36)
    [40]

    у меня 10.2.0.2
    кстати если прихъодилось жабу под mssql-ем гонять пристойно себя ведет?


     
    Игорь Шевченко ©
     
    (2006-11-14 17:42)
    [41]

    k2 ©   (14.11.06 17:20) [38]
    ANB ©   (14.11.06 17:30) [39]

    Кстати фриварная только что скачаная жаба (8.5.0.50g) точно так же не умеет с десяткой работать на предмет процедур/пакетов.
    Что интересно — ТОРА умеет. Но Тора глючная и тормозная.

    Val ©   (14.11.06 17:02) [36]


    > да вроде %TYPE неплохо справляется…

    В какое место в объявлении поля в таблице вставлять %TYPE  ?


     
    k2 ©
     
    (2006-11-14 17:57)
    [42]

    Игорь Шевченко ©   (14.11.06 17:42) [41]
    Oracle Developer немножко знает про домены, после генерации на базе это выглядит как табличка cg_ref_codes (сейчас нет дизайнера, не знаю настраивается) вида:
    CREATE TABLE <Schema>.CG_REF_CODES
    (
     RV_DOMAIN        VARCHAR2(100)                NOT NULL,
     RV_LOW_VALUE     VARCHAR2(240)                NOT NULL,
     RV_HIGH_VALUE    VARCHAR2(240),
     RV_ABBREVIATION  VARCHAR2(240),
     RV_MEANING       VARCHAR2(240),
     RV_TYPE          VARCHAR2(10)
    )
    TABLESPACE USERS
    LOGGING
    NOCACHE
    NOPARALLEL;
    CREATE INDEX <Schema>.X_CG_REF_CODES_1 ON <Schema>.CG_REF_CODES
    (RV_DOMAIN, RV_LOW_VALUE)
    LOGGING
    TABLESPACE <USERS>
    NOPARALLEL;
    DROP SYNONYM SGDEVNU1.CG_REF_CODES;
    CREATE SYNONYM SGDEVNU1.CG_REF_CODES FOR <Schema>.CG_REF_CODES;
    ALTER TABLE <Schema>.CG_REF_CODES ADD (
     CONSTRAINT RV_PK PRIMARY KEY (RV_DOMAIN, RV_LOW_VALUE));
    если это те домены и ничего не попутала :)


     
    Val ©
     
    (2006-11-14 17:57)
    [43]

    >[41] Игорь Шевченко ©   (14.11.06 17:42)
    зачем?


     
    Игорь Шевченко ©
     
    (2006-11-14 18:03)
    [44]

    Val ©   (14.11.06 17:57) [43]


    > зачем?

    Ну чтобы домен был.

    Оно ж как мыслится:

    CREATE DOMAIN DFOO CHAR(3) DEFAULT «BAR» NOT NULL
     CHECK (DFOO IN («BAR», «BAZ», «BOO»));

    а в объявлении таблицы пишешь просто
    CREATE TABLE FOOTABLE (
     ….
     FOO DFOO,
     …
    );


     
    Игорь Шевченко ©
     
    (2006-11-14 18:04)
    [45]

    k2 ©   (14.11.06 17:57) [42]

    То ж небось для самого дизайнера…


     
    Val ©
     
    (2006-11-14 18:06)
    [46]

    >[42] k2 ©   (14.11.06 17:57)
    Здесь под доменом понимается определенный пользователем тип, который может быть и типом поля таблицы. Такого в Оракле пока я не встретил.


     
    Val ©
     
    (2006-11-14 18:22)
    [47]

    >[44] Игорь Шевченко ©   (14.11.06 18:03)
    Ну не знаю… Дело привычки. В ИБ привык, в Оракле затем отвык — оказалось не так уж и нужно мне это в таблицах.


     
    ANB ©
     
    (2006-11-14 18:48)
    [48]


    > Игорь Шевченко ©   (14.11.06 18:04) [45]

    Не. Как то же оракл разрешает создавать поля с объектными типами. Надо просто покопаться.
    Хотя впрямую — да, обломс.


     
    Val ©
     
    (2006-11-14 19:02)
    [49]

    >ANB ©   (14.11.06 18:48)
    поля с объектыми типами? может, таблицы объектного типа?


     
    Desdechado ©
     
    (2006-11-14 19:09)
    [50]

    Val ©   (14.11.06 19:02) [49]
    и поля объектных типов тоже


     
    Val ©
     
    (2006-11-14 19:17)
    [51]

    >[50] Desdechado ©   (14.11.06 19:09)
    речь о вложенных таблицах?


     
    Desdechado ©
     
    (2006-11-14 20:41)
    [52]

    Val ©   (14.11.06 19:17) [51]
    нет, например:
    CREATE TABLE TUNE(
     REGION_ID        NUMBER(10) NOT NULL,
     SDO_MIN_RECT     MDSYS.SDO_GEOMETRY,
     SDO_DIMINFO        MDSYS.SDO_DIM_ARRAY
    );


     
    Игорь Шевченко ©
     
    (2006-11-15 10:27)
    [53]

    Val ©   (14.11.06 18:22) [47]


    > Ну не знаю… Дело привычки. В ИБ привык, в Оракле затем
    > отвык — оказалось не так уж и нужно мне это в таблицах.

    Мне просто лень писать каждый раз одни и те же проверки. И лень потом исправлять во многих местах, если DOMAIN изменился по какой-то причине.


     
    Val ©
     
    (2006-11-15 14:24)
    [54]

    >Desdechado ©   (14.11.06 20:41)
    MDSYS.SDO_GEOMETRY
    и
    MDSYS.SDO_DIM_ARRAY
    не являются таблицами по сути?

    >[53] Игорь Шевченко ©   (15.11.06 10:27)
    С этим я согласен(не зря же домены придуманы), но есть другой нюанс — создавая ограничения руками — вы именуете их как нужно вам, всегда можете ими управлять для конкретной таблицы не трогая других и т.д. Просто разные подходы.


    Понравилась статья? Поделить с друзьями:
  • Variable not defined vba как исправить
  • Variable might not have been initialized java ошибка
  • Var log xorg 0 log error
  • Var log cups error log
  • Var log apache2 error log