Quantcast
Channel: Question and Answer » oracle
Viewing all articles
Browse latest Browse all 717

permissions for yet another “ORA-06512: table or view does not exist” scenario

$
0
0

See the code below. I’m running the code with user x in schema y. The exact same code works if I run it by user x in schema x, but not with user x in schema y. I get the error ORA-06512: table or view does not exist. Why would this be? I’m setting the schema explicitly to y. When running JUST the create statement with user x in schema y, it runs fine. And when running JUST the create statement with user x in schema x, it also runs fine.

There are two synonyms in schema y, called aaaaa and bbbbb. See y.aaaaa and y.bbbbb in the create statement. Synonym y.aaaaa selects data from table z.aaaaa in schema z. Synonym y.bbbbb selects data from table z.bbbbb in schema z. user x currently has SELECT permissions on these two tables in schema z. I renamed the synonyms (y.aaaaa and y.bbbbb) in schema y so they’re easier to find.

The XSQL is the culprit, but not sure what permissions we need. When XSQL(sql_code) is commented out, it doesn’t throw the error.

This doesn’t work:

alter session set current_schema=y;

DECLARE sql_code VARCHAR2(4000) :=
'create table basis as '||
'(select my_basecode,c_fullname,encounter_num,concept_cd from aaaaa basis '||
'        inner join enc on enc.patid = basis.patient_num and enc.encounterid = basis.encounter_num '||
'     join bbbbb basiscode  '||
'        on basis.modifier_cd = basiscode.c_basecode '||
'        and basiscode.c_fullname like ''BASIS%'') ';
BEGIN
  DROPSQL('DROP TABLE basis');
  XSQL(sql_code);
END;

This works:

alter session set current_schema=y;

create table basis as
(select my_basecode,c_fullname,encounter_num,concept_cd from aaaaa basis
        inner join enc on enc.patid = basis.patient_num and enc.encounterid = basis.encounter_num
     join bbbbb basiscode
        on basis.modifier_cd = basiscode.c_basecode '||
        and basiscode.c_fullname like 'BASIS%');

For reference purposes:

create or replace PROCEDURE XSQL(sqlstring VARCHAR2) AS 
BEGIN
  EXECUTE IMMEDIATE sqlstring;
  dbms_output.put_line(sqlstring);
END XSQL;

Viewing all articles
Browse latest Browse all 717

Trending Articles