Меню

Statement ignored oracle ошибка

totn Oracle Error Messages


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

Description

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

  • ORA-06550: line num, column num: str

Cause

You tried to execute an invalid block of PLSQL code (like a stored procedure or function), but a compilation error occurred.

Resolution

The option(s) to resolve this Oracle error are:

Option #1

Refer to the line and column numbers (in the error message) to find the compilation error and correct it. Then try recompiling your code.

Let’s look at an example of how to resolve an ORA-06550 error. For example, if you created a procedure called TestProc as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    vnum number;
  4  BEGIN
  5    vnum := vAnotherNum;
  6  END;
  7  /

Warning: Procedure created with compilation errors.

This procedure was created with compilation errors. So if we try to execute this procedure, we will get an ORA-06550 error as follows:

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

*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object EXAMPLE.TESTPROC is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

You can run the SHOW ERROR command to view the errors as follows:

SQL> show error procedure TestProc;
Errors for PROCEDURE TESTPROC:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1	 PL/SQL: Statement ignored
5/9	 PLS-00201: identifier 'VANOTHERNUM' must be declared

As you can see, the error is caused by the variable called VANOTHERNUM not being declared. To resolve this error, we can modify our TestProc procedure to declare the variable as follows:

SQL> CREATE OR REPLACE PROCEDURE TestProc
  2  AS
  3    vnum number;
  4    vAnotherNumber number;
  5  BEGIN
  6    vAnotherNum := 999;
  7    vnum := vAnotherNum;
  8  END;
  9  /

Procedure created.

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

SQL> execute TestProc();

PL/SQL procedure successfully completed.

Этот код SQL выдает мне ошибку «Ошибка в строке 2: PL / SQL: инструкция проигнорирована». Я работаю над приложением SQL oracle express / APEX: я пробовал все, что мог придумать, и каждый раз это вызывает у меня разные проблемы.

CREATE or replace TRIGGER remove_artista 
   instead of delete on V_ARTISTA
REFERENCING old AS orow
FOR EACH ROW
BEGIN
if exists(select * from Utilizadores where pessoaID = orow.pessoaID) then
        delete from Pessoas where pessoaID = orow.pessoaID;
ELSE
        delete from Artistas where pessoaID = orow.pessoaID;
        delete from Pessoas where pessoaID = orow.pessoaID;
end if;
END;

Вид:

create or replace view v_artista as 
 select 
pessoaID, nome_p, sexo, data_nasc, nome_art, biografica
from Pessoas natural inner join Artistas;

РЕДАКТИРОВАТЬ: исправлена ​​небольшая опечатка в коде.

2 ответа

Лучший ответ

Полная ошибка, которую я получаю от вашего триггера, выглядит следующим образом:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/1      PL/SQL: Statement ignored
2/4      PLS-00204: function or pseudo-column 'EXISTS' may be used inside
         a SQL statement only

По сути, проблема в том, что вы не можете сказать if exists(...), как вы это делаете. Oracle не позволяет вам.

Вместо этого попробуйте выбрать количество совпадающих строк в таблице Utilizadores в локальной переменной, а затем использовать это в своем операторе if:

CREATE or replace TRIGGER remove_artista 
   instead of delete on V_ARTISTA
REFERENCING old AS orow
FOR EACH ROW
DECLARE
  l_count       INTEGER;
BEGIN
  select count(*) 
    into l_count
    from Utilizadores
   where pessoaID = :orow.pessoaID;

  if l_count > 0 then
        delete from Pessoas where pessoaID = :orow.pessoaID;
  ELSE
        delete from Artistas where pessoaID = :orow.pessoaID;
        delete from Pessoas where pessoaID = :orow.pessoaID;
  end if;
END;

Мне также нужно было заменить orow на :orow. После внесения этого изменения ваш триггер скомпилирован для меня.


4

Luke Woodward
24 Май 2014 в 00:06

Я не думаю, что вы можете использовать конструкцию IF EXISTS, чтобы проверить, существует ли строка. Вы можете использовать SELECT COUNT(*) INTO <a variable>. Однако вам может не понадобиться проверять, существует ли строка. Следующий код, вероятно, подойдет:

CREATE OR REPLACE TRIGGER remove_artista 
INSTEAD OF DELETE ON V_ARTISTA
FOR EACH ROW
BEGIN
  DELETE FROM PESSOAS
  WHERE PESSOAID = :OLD.PESSOAID;

  DELETE FROM Artistas
  WHERE PESSOAID = :OLD.PESSOAID
  AND NOT EXISTS (SELECT 1 FROM UTILIZADORES WHERE PESSOAID = :OLD.PESSOAID);  

END;

Строка из PESSOAS в любом случае будет удалена. Строка из ARTISTAS будет удалена, только если PESSOAID не существует в UTILIZADORES.

Ссылки :

Проверить, существует ли запись на форуме OTN


2

Joseph B
24 Май 2014 в 00:11

Summary

After
restoring an Oracle backup the Bizagi application does not start and
the Event Viewer displays errors with code ORA-06550 and PLS-00905.

Applies to

Bizagi
Engine 10.x using Oracle Database

Symptoms

After
restoring an Oracle backup, the Bizagi application does not start and
the Event Viewer displays the a trace like:

ORA-06550: line 1, column 7:
PLS-00905:
object BIZAGIGO.SPBA_WFE_GETNEXTASYNCWIFORRUN is invalid

ORA-06550: line
1, column 7:

PL/SQL:
Statement ignored

The
affected stored procedure may vary and the failed line and column as
well.

Cause

The
problem occurs due to some of the stored procedures may have
compilation errors. To identify the failing procedure, you may use an
Oracle database tool for SQL development.

Solution

1.
Run the following procedure in your database

grant execute on
sys.dbms_lock to [usrBizagi]

In
which, [usrBizagi]
is the Bizagi user for the schema

2.
Recompile the stored procedures that are failing.

3.
Restart Bizagi services and test.


Yesterday, while learning oracle stored procedures, I wrote a demo of stored procedures. The statement is as follows:


CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR2(20))
AS
    psssal TESTDELETE.TESTID%TYPE;
BEGIN
    SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME;
    UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;
    DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the raise'||(psssal+1000));
end;
/

The idea is to find the number type field through the varchar(20) type field of the table, and then change the number type field. The table structure is as follows:

create table TESTDELETE
(
    TESTID   NUMBER,
    TESTNAME VARCHAR2(20)
)

Call the stored procedure, and the result is as follows:


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR2(20))
  2  AS
  3      psssal TESTDELETE.TESTID%TYPE;
  4  BEGIN
  5      SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME;
    UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;
    DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the raise'||(psssal+1000));
  8  end;
  9  /

Warning: Procedure created with compilation errors.

SET SERVEROUTPUT ON;
BEGIN
    RAISESALARY('name2091');
    COMMIT;
END;
SQL>   2    3    4    5  /
    RAISESALARY('name2091');
    *
ERROR at line 2:
ORA-06550: line 2, column 5:
PLS-00905: object TEST.RAISESALARY is invalid
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored


SQL> 

An error occurred: the stored procedure is not valid.

what? The stored procedure that Mingming just established. Then I turn to the above sentence after creation, Warning: Procedure created with compilation errors.

That is to say, there is an error in creating the stored procedure. OK, look for the stored procedure to see what is wrong.

emmmm, looking back for a long time, just a few lines, I can’t see what’s wrong, baidu, google.

Later, I saw this in StackOverFlow. The original link is as follows:

https://stackoverflow.com/questions/48497140/oracle-sql-stored-procedure-object-invalid

The landlord found a saying in it:

You can’t give a size or precision restriction for the data type of a formal parameter to a function or procedure, so NUMBER(10,0) should just be NUMBER;

That is, you cannot specify the size or precision of the data for the parameters of functions and stored procedures. OK, looking back at my parameter, I see that varchar2(20) clearly specifies the precision for the parameter type. You need to change to varchar2.

Or write the table name. Field% TYPE directly.

After the change, run as follows:

CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR)
  2  AS
  3      psssal TESTDELETE.TESTID%TYPE;
  4  BEGIN
  5      SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME;
    UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;
    DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the raise'||(psssal+1000));
  8  end;
  9  /

Procedure created.

BEGIN
    RAISESALARY('name2091');
  3      COMMIT;
  4  END;
  5  /
The original salary2091    After the raise3091

PL/SQL procedure successfully completed.

SQL> 

After the modification, it is clear that there is no warning. The Procedure created appears

Run successfully! Problem solving.


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • State of decay ошибка при запуске приложения 0xc0000906
  • State of decay ошибка при запуске приложения 0xc000007b