Home > database >  get error on add CONSTRAINT to table oracle
get error on add CONSTRAINT to table oracle

Time:12-11

i use oracle 19c

the table tbl_users is exist and can other constraint to table this problem happen after i drop json constraint from table and want to add again

when running this code

ALTER TABLE TBL_USERS
ADD CONSTRAINT TBL_USERS_JSON_chk CHECK 
(CUSTOM_DATA IS JSON
AND REQUESTS_STATUS IS JSON
AND LOCATION IS JSON
AND MULTI_ACCESS IS JSON)
ENABLE;

get this error

Error report -
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
00604. 00000 -  "error occurred at recursive SQL level %s"
*Cause:    An error occurred while processing a recursive SQL statement
           (a statement applying to internal dictionary tables).
*Action:   If the situation described in the next error on the stack
           can be corrected, do so; otherwise contact Oracle Support.

I can add other CONSTRAINT to the table but just want to add JSON CONSTRAINT to get this error

SQL* OUTPUT

SQL> SELECT COUNT(*) FROM ECODB.TBL_USERS;

  COUNT(*)
----------
     24364

SQL> ALTER TABLE ECODB.TBL_USERS
  2  ADD CONSTRAINT TBL_USERS_JSON_chk CHECK
  3  (CUSTOM_DATA IS JSON
  4  AND REQUESTS_STATUS IS JSON
  5  AND LOCATION IS JSON
  6  AND MULTI_ACCESS IS JSON)
  7  ENABLE;
ALTER TABLE ECODB.TBL_USERS
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist

CodePudding user response:

Oracle said it all:

ORA-00942: table or view does not exist

You can't add a constraint o a non-existing table. Looks like you

  • didn't create it
  • dropped it
  • mistyped its name

Note that not all Oracle database versions support the JSON check. For example, in 11g it won't work:

SQL> select * From v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> create table tbl_users
  2    (custom_data varchar2(20),
  3     requests_status varchar2(20)
  4    );

Table created.

SQL> alter table tbl_users add constraint tbl_users_json_chk check
  2    (    custom_data     is json
  3     and requests_status is json
  4    );
  (    custom_data     is json
                          *
ERROR at line 2:
ORA-00908: missing NULL keyword


SQL>

In 12c and above it'll work:

SQL> select * From v$version;
<snip>
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
<snip>

SQL> create table tbl_users
  2    (custom_data varchar2(20),
  3     requests_status varchar2(20)
  4    );

Table created.

SQL> alter table tbl_users add constraint tbl_users_json_chk check
  2    (    custom_data     is json
  3     and requests_status is json
  4    );

Table altered.

SQL>

[EDIT]

That's really strange. Went to My Oracle Support and found document ID 2665636.1 - it says that adding an IS JSON check constraint on a table which has dependent views fails.

What do you get if you run this query (while connected as ECODB user)?

select name, type
from user_dependencies
where type = 'VIEW'
  and referenced_type = 'TABLE'
  and referenced_name = 'TBL_USERS';

If query returned some rows, then yes - you've hit the bug.

What to do? Apply the patch which fixes it.

  • Related