Non oracle error

I got " ORA-28500: connection from ORACLE to a non-Oracle system " error in Oracle.

April 28, 2021

I got ” ORA-28500: connection from ORACLE to a non-Oracle system ” error in Oracle.

ORA-28500: connection from ORACLE to a non-Oracle system

Details of error are as follows.

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:

[Transparent gateway for ODBC]DRV_InitTdp: [DATADIRECT][ODBC SQL Server Driver][SQL Server] Login failed (SQL State: 28000; SQL Code: 4002)
ORA-02063: preceding 3 lines from HSTEST
Cause: The Oracle database link created for the foreign datasource has either no credentials or incorrect credentials.
Action: Recreate the Oracle database link with the proper username and password.


unable to get a stable set of rows in the source tables

This ORA-28500 errors are related with the Oracle database link created for the foreign datasource has either no credentials or incorrect credentials.

To solve this error, you should check and fix the username and password.  username and password must be in double quotes as follows.

create database link test connect to "sa" identified by "mehmet" using 'hsodbc'.

create [public] database link test connect to "user_name" identified by "password" using 'MSDB';

Sometimes The issue is caused by a problem with character and language settings.

Add the following to the DG4ODBC init.ora file:

HS_NLS_NCHAR=UCS2
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1

Do you want to learn Oracle Database for Beginners, then read the following articles.

Oracle Tutorial | Oracle Database Tutorials for Beginners ( Junior Oracle DBA )

 1,347 views last month,  1 views today

About Mehmet Salih Deveci

I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience.I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource.I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks.I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients.If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress [email protected].-                                                                                                                                                                                                                                                 -Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  [email protected] a mail atabilirsiniz.

Please acknowledge-106557-106557:non ORACLE exception

Hi everyone.
I have created a form in which the required data gets displayed in the excel (.xls) file on clicking a button.
When i run the form, I am getting error that is FRM-40735: WHEN-BUTTON PRESSED trigger raised unhandled exception ORA-106557.
When i run the form again, I am getting result as expected. It works perfectly fine.
After i log in to the software, only for the first click i get that error. Later it works fine.
So i tried to catch the exact error by putting an exception code that is:
EXCEPTION
WHEN OTHERS THEN
MESSAGE(SQLCODE||’ — ‘||SQLERRM);
PAUSE;
END;
After compiling with the exception; I got an error message and an error alert window.
The Error window shows ‘Please acknowledge’.
The Error message is -106557-106557:non ORACLE exception .
I am not getting to know what is wrong exactly because it shows FRM-40735 error only for the first time, later it works fine.
Can you Help me with this.
Thank You.

DECLARE
  CURSOR C_EXCEL IS
  SELECT DISTINCT INDIRECT_RECD.SLNO SLNO,
  INDIRECT_RECD.COMPLIANCE COMPLIANCE,
  INDIRECT_RECD.DUE_DATE DUE_DATE,
  INDIRECT_RECD.UNIT1 UNIT1,
  INDIRECT_RECD.UNIT2 UNIT2,
  INDIRECT_RECD.UNIT4 UNIT4,
  INDIRECT_RECD.UNIT5 UNIT5,
  INDIRECT_RECD.UNIT6 UNIT6,
  INDIRECT_RECD.UNIT7 UNIT7,
  INDIRECT_RECD.UNIT11 UNIT11,
  INDIRECT_RECD.UNIT12 UNIT12,
  INDIRECT_RECD.UNIT14 UNIT14,
  INDIRECT_RECD.UNIT15 UNIT15,
  INDIRECT_RECD.UNIT16 UNIT16,
  INDIRECT_RECD.UNIT18 UNIT18,
  INDIRECT_RECD.UNIT20 UNIT20,
  INDIRECT_RECD.UNIT25 UNIT25,
  INDIRECT_RECD.UNIT91 UNIT91,
  INDIRECT_RECD.COMP_MONTH COMP_MONTH
  FROM INDIRECT_RECD
  WHERE COMP_MONTH=:IT_DATE;
  CONVID PLS_INTEGER;
   ROWCOUNT NUMBER;
   RW NUMBER:= 7;
   RR NUMBER :=2;
   x number :=0;
   sn number := 1;
   OUT_FILE Text_IO.File_Type;
   FNAME VARCHAR2(50);
BEGIN
  FNAME := GET_FILE_NAME(‘C:’, File_Filter=>’Excel Files (*.xls)|*.xls|’,DIALOG_TYPE=>SAVE_FILE);
  IF FNAME IS NOT NULL THEN
  OUT_FILE := Text_IO.Fopen(FNAME, ‘w’);
  Text_IO.Fclose (out_file);
   CONVID := DDE.App_Begin(‘C:PROGRAM FILESMICROSOFT OFFICEOFFICEEXCEL.EXE ‘||FNAME,
   DDE.APP_MODE_MAXIMIZED);
   dbms_lock.sleep(1);
  ConvID := DDE.Initiate(‘EXCEL’, FNAME);
  DDE.Poke(ConvID,’R1C2′,’COMPANY LTD.’,DDE.CF_TEXT,2000);
  DDE.Poke(ConvID,’R2C2′,’INDIRECT.’, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R3C2′,’MONTHLY REPORT — CLOSED.’, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R4C2′,’For the MONTH/YEAR = ‘||to_char(to_date(:IT_DATE,’RRRR/MM’),’MONTH/RRRR’), DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C1′,’SLNo.’, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C2′,’Compliance’, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C3′,’Due_Date’, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C4′,’Unit-1′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C5′,’Unit-2′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C6′,’Unit-4′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C7′,’unit-5′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C8′,’Unit-6′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C9′,’Unit-7′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C10′,’Unit-11′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C11′,’Unit-12′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C12′,’Unit-14′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C13′,’Unit-15′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C14′,’Unit-16′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C15′,’Unit-18′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C16′,’Unit-20′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C17′,’Unit-25′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C18′,’Unit-91′, DDE.CF_TEXT, 2000);
  DDE.Poke(ConvID,’R6C18′,’YEAR/MM’, DDE.CF_TEXT, 2000);
   For i in C_EXCEL
     loop
     sn := sn + 1;
            DDE.Poke(ConvID,’R’||RW||’C’||1,nvl(i.SLNO,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||2,nvl(i.COMPLIANCE,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||3,nvl(to_char(i.DUE_DATE,’DD-MON-RRRR’),’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||4,nvl(i.UNIT1,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||5,nvl(i.UNIT2,’ ‘), DDE.CF_TEXT, 2000);
        DDE.Poke(ConvID,’R’||RW||’C’||6,nvl(i.UNIT4,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||7,nvl(i.UNIT5,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||8,nvl(i.UNIT6,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||9,nvl(i.UNIT7,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||10,nvl(i.UNIT11,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||11,nvl(i.UNIT12,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||12,nvl(i.UNIT14,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||13,nvl(i.UNIT15,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||14,nvl(i.UNIT16,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||15,nvl(i.UNIT18,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||16,nvl(i.UNIT20,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||17,nvl(i.UNIT25,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||18,nvl(i.UNIT91,’ ‘), DDE.CF_TEXT, 2000);
     DDE.Poke(ConvID,’R’||RW||’C’||18,nvl(i.COMP_MONTH,’ ‘), DDE.CF_TEXT, 2000);
     RW := RW+1;
     x :=1;
  end loop;
RR:=RW-1;
  IF x  = 1 THEN
  DDE.Poke(ConvID,’R’||RW||’C2′,’END OF REPORT’, DDE.CF_TEXT, 2000);
  ELSE
  DDE.Poke(ConvID,’R7C1′,’No Data Found’, DDE.CF_TEXT, 2000);
  END IF;
  END IF;
End;
Please acknowledge-106557-106557:non ORACLE exception 

Oracle 11g Logo

While recovering my manual physical standby data guard configuration, Every time oracle would apply all archive logs to standby database and end up with following mentioned errors.

As a part of troubleshooting, I have Verified:

  • Archive log sequence number on both the side but that was in place.
  • Block corruptions on datafiles level on both sides. It was clean.
  • Physical storage blocks, It was also clean.
  • Almost verify everything, that i can.

After scratching my head for several hours, I found non oracle files situated on FRA. After moving it from FRA, Recovery process successfully carried out. Non oracle file was only culprit to the following mentioned errors. It was very strange case I have faced in my life.

Solution:

Remove all non oracle files from FRA.

Error logs:

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 15198931 generated at 07/23/2015 17:55:02 needed for thread 1
ORA-00289: suggestion :
/u02/oradata/flash_recovery_area/DB1/archivelog/2015_07_23/o1_mf_1_5180_bv1qlby6_.arc
ORA-00280: change 15198931 for thread 1 is in sequence #5180
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 15199107 generated at 07/23/2015 18:00:02 needed for thread 1
ORA-00289: suggestion :
/u02/oradata/flash_recovery_area/DB1/archivelog/2015_07_23/o1_mf_1_5181_bv1qvq3n_.arc
ORA-00280: change 15199107 for thread 1 is in sequence #5181
ORA-00278: log file '/u02/oradata/flash_recovery_area/DB1/archivelog/2015_07_23/o1_mf_1_5180_bv1qlby6_.arc' no longer needed for this recovery
ORA-27047: unable to read the header block of file
Linux-x86_64 Error: 25: Inappropriate ioctl for device
Additional information: 1
ORA-27048: skgfifi: file header information is invalid
ORA-27072: File I/O error
Linux-x86_64 Error: 25: Inappropriate ioctl for device
Additional information: 4
Additional information: 1
Additional information: 392
ORA-27047: unable to read the header block of file
Linux-x86_64 Error: 25: Inappropriate ioctl for device
Additional information: 1
ORA-27047: unable to read the header block of file
Linux-x86_64 Error: 25: Inappropriate ioctl for device
Additional information: 1
ORA-27048: skgfifi: file header information is invalid
ORA-27072: File I/O error
Linux-x86_64 Error: 25: Inappropriate ioctl for device
Additional information: 4
Additional information: 1
Additional information: 392
ORA-27047: unable to read the header block of file
Linux-x86_64 Error: 25: Inappropri

Thanks,

Stay Tune. 🙂

PL/SQL блок:

DECLARE
…  — объявляющая секция
BEGIN
…  — выполняющая секция
EXCEPTION
…  — секция обработки исключительных ситуаций
END;
/

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

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

Исключения бывают:

— стандартные
— определенные пользователем

Стандартные исключительные ситуации инициируются автоматически при возникновении
соответствующей ошибки Oracle.

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

Обрабатываются исключения так:

EXCEPTION
    WHEN имя_ex1 THEN
        …; — обработать
    WHEN имя_ex2 THEN
        …; — обработать
    WHEN OTHERS THEN
        …; — обработать
END;
/

Имена исключений не должны повторяться т.е. каждое исключение может
обрабатываться максимум только одним обработчиком в секции EXCEPTION

Один обработчик может обслуживать несколько исключительных ситуаций
и их нужно перечислить в условии WHEN через OR

EXCEPTION
    WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN
        INSERT INTO log_table(info) VALUES (‘A select error occurred.’);
END;
/

Два исключения одновременно один обработчик обработать не может:

WHEN имя_ex1 AND имя_ex2  — > ERR

Пользовательское исключение должно быть определено:

DECLARE
    e_my_ex EXCEPTION;
    …
BEGIN
    IF (…) THEN
        RAISE e_my_ex;
    END IF;
    …

EXCEPTION
    WHEN e_my_ex THEN
    …
END;
/

После перехвата более специализированных исключений:

WHEN … THEN

WHEN … THEN

мы можем перехватить все остальные исключения с помощью:

WHEN OTHERS THEN

Обработчик OTHERS рекомендуется помещать на самом высоком уровне программы:
(В самом высшем блоке)
для обеспечения распознавания всех возможных ошибок.

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

Не используйте в промышленном коде такое:

WHEN OTHERS THEN NULL;

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

Обработчик OTHERS должен регистрировать ошибку и возможно предоставлять
дополнительную информацию для дальнейшего исследования.

WHEN OTHERS THEN
    INSERT INTO log_table(info) VALUES (‘Another error occurred.’);
END;
/

Информацию об ошибках можно получить при помощи двух встроенных функций:

— SQLCODE
— SQLERRM

первая возвращает код текущей ошибки а вторая текст сообщения об ошибке

Для исключений определенных пользователем:

SQLCODE возвращает 1
а
SQLERRM «User-defined Exception»

WHEN OTHERS THEN
    v_ErrorCode := SQLCODE;
    v_ErrorText := SUBSTR(SQLERRM, 1, 200);
    INSERT INTO log_tab(code, message, info) VALUES (v_ErrorCode, v_ErrorText, ‘Oracle error.’);
END;
/

В таблице log_tab поле message ограничено 200 символами
и чтобы не произошло ошибки при вставке, мы урезаем длину
сообщения до 200 символов с помощью SUBSTR
А то максимальная длина сообщения может достигать 512 символов.

Функция SQLERRM может принимать один числовой аргумент.
При этом она возвратит текст сообщения об ошибке, код которой равен заданному числу.

Аргумент должен быть всегда отрицательным числом.
Если аргумент равен 0, то будет возвращено сообщение:
ORA-0000: normal, succesful completion

При положительном аргументе не равном 100 будет возвращено сообщение:
non-ORACLE Exception

А при

SQLERRM(100) — > ORA-1403: no data found

Это исключение ANSI

Остальные коды ошибок Oracle все отрицательные.

Для получения информации об ошибке можно также использовать функцию
FORMAT_ERROR_STACK из пакета DBMS_UTILITY

Её можно непосредственно использовать в операторах SQL:

WHEN OTHERS THEN
    INSERT INTO log_tab(code, message, info) VALUES (NULL,
                                                     SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK, 1, 200),
                                                    ‘Oracle error occurred.’);
END;
/

Ещё одна функция.

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

она аналогична  FORMAT_ERROR_STACK
но не подвержена ограничению длины сообщения в 2000 байт.
Она возвращает полностью весь стек ошибок на момент инициирования исключительной ситуации.

Любое именованное исключение можно связать с конкретной ошибкой ORACLE.

Например, в ORACLE есть стандартная ошибка ORA-1400, которая возникает при пропуске значения
или вставке значения NULL в столбец с ограничением NOT NULL.

ORA-1400: mandatory NOT NULL column missing or NULL during insert.

Мы хотим создать свое пользовательское именованное исключение и связать его с этой стандартной ошибкой ORA-1400

DECLARE
e_my_ex EXCEPTION;
PRAGMA EXCEPTION_INIT(e_my_ex, -1400);

BEGIN
WHEN e_my_ex THEN
    INSERT INTO log_tab(info) VALUES (‘ORA-1400 occurred.’);
END;
/

Теперь мы перехватываем её по имени с помощъю WHEN или THEN

Все стандартные исключительные ситуации также ассоциируются с соответствующими им ошибками Oracle
при помощи прагмы EXCEPTION_INIT в пакете STANDARD

VALUE_ERROR  — > ORA-6501
TO_MANY_ROWS — > ORA-1422
ZERO_DIVIDE  — > ORA-1476
……….
и т.д.

Так что если вам не хватает некоего имени конкретной ошибки ORA-NNNN,
то придумайте свое имя и свяжите его с ошибкой с помощью прагмы : EXCEPTION_INIT

Для собственных пользовательских исключений можно придумать свои коды ошибок, которые разрешено брать из диапазона:
-20000 до -20999
и придумать свой текст сообщения

RAISE_APPLICATION_ERROR(номер, текст, [флаг]);

TRUE — пополнить список ранее произошедших ошибок
FALSE — новая ошибка заместит текущий список ошибок (по умолчанию)

set serveroutput on

variable a NUMBER;
variable b NUMBER;

exec :a := 0;
exec :b := 10;

DECLARE
    l_a NUMBER := :a;
    l_b NUMBER := :b;
    l_c NUMBER;

BEGIN
    IF l_a = 0 THEN
        raise_application_error(-20005, ‘Divizor is 0’);
    END IF;
    l_c := l_b / l_a;
    dbms_output.put_line(‘The result: ‘||l_c);
EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
END;
/

Поскольку у исключения нет имени, то его может обработать только обработчик OTHERS

Но такое исключение можно и поименовать
и с помощью прагмы связать с нашим кодом.

DECLARE

    my_ex EXCEPTION;
    …..
    …..
    PRAGMA EXCEPTION_INIT(my_ex, -20005);

BEGIN
    IF (…) THEN
        raise_application_error(-20005, ‘Divizor is 0’);
    …..
    …..

EXCEPTION
    WHEN my_ex THEN
        dbms_output.put_line(SQLERRM);
END;
/

Теперь это исключение можно обработать по имени с помощью:

WHEN my_ex THEN

EXCEPTION PROPAGATION

enclosing block  — обьемлющий блок

Если в текущем блоке имеется обработчик данной исключительной ситуации,
то он выполняется и блок успешно завершается.
Управление передаётся вышестоящему блоку.

Если обработчик отсутствует, исключительная ситуация передается в обьемлющий блок и инициируется там.
Если обьемлющего блока не существует, то исключение будет передано вызывающей среды (например SQL*Plus).

При вызове процедуры также может создаваться обьемлющий блок:

BEGIN

    p(…); — вызов процедуры
EXCEPTION
    WHEN OTHERS THEN
        — исключение инициированное p()
        — будет обработано здесь
END;
/

Исключения инициируемые в секции обьявлений (DECLARE) не обрабатываются секцией EXCEPTION
текущего блока, а передаются в EXCEPTION обьемлющего блока.

Тоже самое, если исключение инициируется в секции EXCEPTION,
то обработка данного исключения передается в обьемлющий блок.

Исключительную ситуацию можно обработать в текущем блоке и сразу снова установить
то же самое исключение, которое будет передано в обьемлющую область:

DECLARE

    A EXCEPTION;
BEGIN

    RAISE A;
EXCEPTION
    WHEN A THEN
        INSERT INTO log_tab(info) VALUES (‘Exception A occurred.’);
        COMMIT;
        RAISE;
END;
/

Тут commit гарантирует, что результаты insert будут зафиксированы
в базе данных в случае отката транзакции.

С помощью пакета UTL_FILE можно избежать необходимости commit
или используйте автономные транзакции.

Область действия исключительной ситуации

BEGIN
    DECLARE
        e_ex EXCEPTION;  — видно по имени только внутри блока
    BEGIN
        RAISE e_ex;
    END;
EXCEPTION
    — тут исключение не видно по имени e_ex
    — и его можно обработать с помощью обработчика OTHERS

    WHEN OTHERS THEN
        — инициируем это исключение повторно
        RAISE;  — Теперь это исключение передается вызывающей среде
END;
/

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

Как описать исключение, которое будет видно вне блока?

Нужно создать пакет Globals и описать в нем пользовательское исключение.
Такая исключительная ситуация будет видима и во внешнем блоке.

CREATE OR REPLACE PACKAGE Globals AS
    e_ex EXCEPTION;
END Globals;

BEGIN
    BEGIN
        RAISE Globals.e_ex;
    END;

EXCEPTION
    WHEN Globals.e_ex THEN
        — инициируем повторно
        — для передачи в вызывающую среду
        RAISE;
END;
/

  В пакете Globals можно также объявлять:

— таблицы
— переменные
— типы

Избегайте необработанных исключений
Нельзя допускать завершение программ, пока в них остаются необработанные исключения

Используйте обработчик OTHERS на самом верхнем уровне программы.
И пусть он регистрирует факт и время возникновения ошибки.
И ни одна ошибка не останется без внимания.

DECLARE

    v_ErrorNumber NUMBER;
    v_ErrorText   VARCHAR2(200);
BEGIN
    …
    …

EXCEPTION
    WHEN OTHERS THEN
        …

        v_ErrorNumber := SQLCODE;
        v_ErrorText   := SUBSTR(SQLERRM, 1, 200);

        INSERT INTO log_tab(code, message, info)
        VALUES (v_ErrorNumber, v_ErrorText,
                ‘Oracle error …at ‘ || to_char(sysdate, ‘DD-MON-YYHH24:MI:SS’));
END;
/

Можно использовать и утилиту  DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
она регистрирует первоначальное местовозникновения исключения.

Как определить, где произошла ошибка?

BEGIN

    SELECT …
    SELECT …
    SELECT …
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    — какой select инициировал ошибку?
END;
/

Можно создать счетчик, указывающий на sql — оператор:

DECLARE

    v_sel_count NUMBER := 1;
BEGIN

    SELECT …
    v_sel_count := 2;
    SELECT …
    v_sel_count := 3;
    SELECT …

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        INSERT INTO log_tab(info)
        VALUES (‘no data found in select ‘||v_sel_count);
END;
/

Можно разместить каждый select в собственном врутреннем блоке

BEGIN

    BEGIN
        SELECT …
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            INSERT INTO log_tab(info)
            VALUES (‘no data found in select 1’);
    END;

    BEGIN
        SELECT …
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            INSERT INTO log_tab(info)
            VALUES (‘no data found in select 2’);
    END;

    BEGIN
        SELECT …
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            INSERT INTO log_tab(info)
            VALUES (‘no data found in select 3’);
    END;

END;
/

Или использовать : DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
и потом анализировать файл трассировки.

Пусть в нашей программе Oracle выдает ошибку ORA-01844: not f valid month

перехватить его можно так:

EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE = -1843 THEN

Да, код плохо читаем.
Сделаем его более лучшим:

PROCEDURE my_procedure
IS
    invalid_month EXCEPTION;
    PRAGMA EXCEPTION_INIT(invalid_month, -1843);

BEGIN
    ….
EXCEPTION
    WHEN invalid_month THEN

так уже более понятней.

  • Procedure or function returning a ref cursor type
    • eFORMz will only accept a result set as input data from a SQL load/update call. A ref cursor is a pointer to a result set and does not actually contain data. When you pass this into eFORMz’s  SQL LOAD/UPDATE functions it will not produce an error because it has accepted the ref cursor’s input that has no input. Please refer to the following links.
    •  PL/SQL 101
    • How To Return A Result Set From SQL Server and Oracle

  • ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
    ORA-02063: preceding line from sid_name

    This error occurs when dg4odbc (under 11g and later) is used without aODBC Driver Manager.
    funcname=SQLColAttributeW hoaerr:28500

  • ORA-28509: unable to establish a connection to non-Oracle system
    • Make sure the HOST parameter in the tnsnames.ora file is correct.
    • Make sure the PORT number is correct.
    • Make sure the SID name is correct in both the TNSNAMES.ORA and LISTENER.ORA

  • ORA-28500: connection from ORACLE to a non-Oracle system returned this message:[Transparent gateway for ODBC][H001] The environment variable <HS_FDS_CONNECT_INFO> is not set.
    • Set HS_FDS_CONNECT_INFO in the hs{sid}init.ora file to the data source name.
      Example: HS_FDS_CONNECT_INFO = <ODBC DataSource Name>
    • Make sure the hs{sid}init.ora file exists in the ORACLE_HOME/hs/admin directory and has the same name as the SID in the LISTENER.ORA.
      Example: If SID=hsodbc in the listener.ora file, then the hs{sid}init.ora file would be named ORACLE_HOME/hs/admin/inithsodbc.ora

    • ORA-02019: connection description for remote database not found
      • Verify that the database link you are using exists.SQL> select db_link,host,created from user_db_links;DB_LINK
        ——————————————————————
        HOST
        ——————————————————————
        CREATED
        —————
        A.MINISOFT.LOCAL
        mscard
        22-MAY-03
      • If no records are found, confirm that the database link is accessible.
        SQL> select db_link,host,created from all_db_links;
        SQL> select db_link,host,created from dba_db_links;
        note: You may need to use PUBLIC or SHARED
        CREATE [SHARED][PUBLIC] DATABASE LINK link_name
        [CONNECT TO CURRENT_USER]
        [USING ‘connect_string’]CREATE [SHARED][PUBLIC] DATABASE LINK link_name
        [CONNECT TO user IDENTIFIED BY password]
        [AUTHENTICATED BY user IDENTIFIED BY password]
        [USING ‘connect_string’]

      • ORA-02068:  following severe error from HS
        • Verify the structure of the tnsnames.ora entry for hsodbc.MSCARD =
          (DESCRIPTION =
          (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oak)(PORT = 1521))
          )
          (CONNECT_DATA =
          (SERVICE_NAME = mscard)
          (SRVR = DEDICATED)
          )
          (HS = OK)
          )

      • ORA-12154: TNS:could not resolve service name

        • The name as tried by oracle could not be located in the TNSNAMES.ORA file. This may be do to a missing entry or incomplete resolution do to a problem in SQLNET.ORA and the default domain.
        • Invalid entry in tnsnames.ora, missing right parentheses.

      • ORA-28545: NCRO Failed to make RSLV connection

        • Verify the hostname in the tnsnames.ora file references your Oracle server.  This should not reference the HP3000.

      • ORA-28500: connection from ORACLE to a non-Oracle system returned this message:[Generic Connectivity Using ODBC][MiniSoft] [3kodbc.dll] In (NetConnect), error 0 Unknown Error – Connect(): Cannot resolve address () (SQL State: 08004; SQL Code: 0)This indicates that the driver was unable to find a server entry in the DSN or was unable to locate the DSN.
        • Check that the odbc.ini file referenced by init{sidname}.ora exists and is readable by the Oracle listener process.

      • If the init{sidname}.ora file cannot be found, the following message will be seen:SQL> select * from customer@a;
        select * from customer@a
        *
        ERROR at line 1:
        ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
        [Generic Connectivity Using ODBC][H006] The init parameter
        is not set. Please set it in init.ora file.
        ORA-02063: preceding 2 lines from A

      • Execution of the Oracle application “hsodbc” should return a banner. If you receive an error message, that the application cannot be run or has a problem with a required library, review your Oracle installation to ensure all components are correctly installed.$ hsodbcOracle Corporation — FRIDAY    SEP 26 2003 08:26:47.268Heterogeneous Agent based on the following module(s):
        – External Procedure Module
        – Transaction Module
        – SQL/PLSQL ModuleIf a library is missing you may see the followingSQL> select * from customer@a;
        select * from customer@a
        *
        ERROR at line 1:
        ORA-28509: unable to establish a connection to non-Oracle system
        ORA-02063: preceding line from AYour listener.log file will show:26-SEP-2003 08:31:13 * (CONNECT_DATA=(SID=mscard)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.23.118)(PORT=49349)) * establish * mscard * 12500
        TNS-12500: TNS:listener failed to start a dedicated server process
        TNS-12547: TNS:lost contact
        TNS-12560: TNS:protocol adapter error
        TNS-00517: Lost contact
        HPUX Error: 32: Broken pipe

You May Also Like

No posts were found for display

Понравилась статья? Поделить с друзьями:
  • Non manifold geometry maya как исправить
  • Non hp battery detected как исправить
  • Nss error 5961
  • Nss atomdb initialization error transas
  • Nslookup non authoritative answer как исправить