PL/SQL: ORA-00942: table or view does not exist
PL-SQL scripti içeren bir job, prosedüre olustururken asagidaki hatayi alabiliiz. ORA-12012: error on auto execute of job 222 ORA-06550: line 8, column 18: PL/SQL: ORA-00942: table or view does not exist
Procedure içerisinde kullandigimiz tablonun oldugundan eminiz ve gerekli yetkiler saglayan role de bulunmakta. Buna ragmen yukardaki hata aliniyor olabilir.
Hatanin nedeni , procedure veya job olustururken farkli bir semanin tablosunu kullanirken DML hakki direk verilmelidir. Bir role ile verilen haklar yukardaki gibi bir sorun olmasina neden olacaktir. Asagidaki gibi bir study case ile sorunu ve çözümü görebiliriz.
**user_a ile login olalim;
create table user_a.test_tablo ( id number, name varchar2(50) ); Table created. insert into user_a.TEST_TABLO values (1,'sss') 1 row inserted. insert into user_a.TEST_TABLO values (2,'qwerty'); 1 row inserted. insert into user_a.TEST_TABLO values (3,'aaaaa'); 1 row inserted. create role test_role; Role created. grant select on user_a.test_tablo to test_role; Grant succeeded. grant test_role to user_b; Grant succeeded.
**Simdi user_b ile login olalim;
select * from user_a.test_tablo; --sorunsuz , çalisti declare v_name varchar2(50); begin select t.name into v_name from user_a.test_tablo t where t.id=3; dbms_output.put_line('3 nolu kayit :'||v_name); end; / --PL/SQL procedure successfully completed.
Buraya kadar hiçbir sorun olmadan çalisti. verdigimiz role ile gerekli yetkiler verildiginden sorun olmadi. DML islemini PLSQL içinde veya guery ile kullanirken sorun olmuyor.
create or replace procedure user_b.test_proc as v_name varchar2(50); begin select t.name into v_name from user_a.test_tablo t where t.id=3; dbms_output.put_line('3 nolu kayit :'||v_name); end test_proc; / Warning: compiled but with compilation errors [Warning] ORA-24344: derleme hatasi ile basardi 4/45 PL/SQL: ORA-00942: table or view does not exist 4/5 PL/SQL: SQL Statement ignored (14: 0): Warning: compiled but with compilation errors
Görüldügü gibi procedure içinde daha önce çalistirdigimiz PLSQL olmasina ragmen sorun verdi.
Simdi grantlari role kullanmadan, direk verelim.
grant select on test_tablo to user_b; Grant complete. create or replace procedure user_b.test_proc as v_name varchar2(50); begin select t.name into v_name from user_a.test_tablo t where t.id=3; dbms_output.put_line('3 nolu kayit :'||v_name); end test_proc; / Procedure created.
User_b, veritabaninda dba role sahip olsa bile user_a nin tablosnu bir procedure içerinsde kullnmasi için yine direk grant’a ihtiyaç olur.