Ошибка: таблица или представление не существует в пакете PL SQL - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть пакет с именем 'S_PKG' в схеме 'A'. Я хочу перенести его в схему B. Я скопировал код и выполнил в схеме B. Затем я хотел выполнить следующий сценарий pl sql, в котором 'S_PKG' используется в схеме B.

select to_char(sysdate,'YYYYMMDD - HH:MI:SS AM') date_time
from dual
/
insert into zzz_ccc
select zzz_ccc_seq.nextval,to_char(sysdate,'YYYYMMDD - HH:MI:SS AM'),
'Start S Load tab',8,user,(select * from global_name)
from dual
/
commit
/
insert into zzz
select zzz_seq.nextval,to_char(sysdate,'YYYYMMDD - HH:MI:SS AM'),
'Start S Load tab',
(select trim(ruser)||' '||trim(rdbase)
from zzz_ccc where ss = 8
and rr = (select max(rr) from zzz_ccc where ss = 8)),
null,null,null,null,null,null,
(select max(rr) from zzz_ccc where ss = 8)
from dual 
/
commit
/
DECLARE
  PV_PRD_ID VARCHAR2(5);
BEGIN
  PV_PRD_ID := '3';
  B.S_PKG.PR_MAIN (PV_PRD_ID);
  COMMIT; 
END; 
/
commit
/
insert into tab_counts(created_dtm,
ora_database,ora_user,ora_table,cc,flg,
subj)
select sysdate,'ccenter','aim10_ccenter','s_package_run - rows',
no_of_rows,1,
'S Load Tab Run'
from s_package_run
where to_char(st_date,'YYYYMM-DD') = to_char(sysdate,'YYYYMM-DD')
and package_name = 'LOAD_TAB'
/
commit
/
insert into tab_counts(created_dtm,
ora_database,ora_user,ora_table,cc,flg,
subj)
select sysdate,'ccenter','aim10_ccenter','s_package_run - dur_min',
dur_min,2,
'S Load Tab Run'
from s_package_run
where to_char(st_date,'YYYYMM-DD') = to_char(sysdate,'YYYYMM-DD')
and package_name = 'LOAD_TAB'
/
insert into hrc_chk_mar14_24_1
select sysdate, 'B', 'COUNT 6   ', 's_load_tab',
null,null,null,null
from dual t1
/
insert into zzz
select zzz_seq.nextval,to_char(sysdate,'YYYYMMDD - HH:MI:SS AM'),
'End S Load tab',
(select trim(ruser)||' '||trim(rdbase)
from zzz_ccc where ss = 8
and rr = (select max(rr) from zzz_ccc where ss = 8)),
null,null,
null,null,null,null,
(select max(rr) from zzz_ccc where ss = 8)
from dual 
/
commit
/

Затем я получил следующую ошибку.

ORA-00942: таблица или представление не существует ORA-06512: в «B.S_PKG», строка 109 ORA-06512: в «B.S_PKG», строка 35 ORA-06512: в строке 5

ТогдаЯ искал пакет. Но я не смог найти точную таблицу, которая дает мне ошибку. Вот мой пакет.

CREATE OR REPLACE PACKAGE BODY B.S_PKG is


PROCEDURE PR_Main(kseq number) IS
sql_stmnt varchar2(5000);
begin

select s_pkg_seq.nextval into dd from dual;

pkg_st_date := sysdate;

sql_stmnt:='truncate table s_msgs';

execute immediate sql_stmnt;


begin
for c_rec in (select * from s_test_1 where pkg_seq = kseq and
flg = 'as' order by pkg_ord)
loop
   if substr(c_rec.run_sql,1,1) != '-' then
   pkg_name :=  c_rec.run_sql;
   PR_Msgs('*** '||c_rec.run_sql||' Started...', pkg_name||'.'||'pr_main');
   else
   PR_Msgs(c_rec.run_sql, pkg_name||'.'||'pr_main');
   end if;
   insert into s_test_3
   values(sysdate,c_rec.run_sql,c_rec.pkg_seq,c_rec.pkg_ord,c_rec.prc_seq);
end loop;
end;


PR_LOAD_PRODUCT3(1,kseq);

PR_LOAD_PRODUCT3(2,kseq);

PR_LOAD_PRODUCT3(3,kseq);

PR_LOAD_PRODUCT3(4,kseq);

PR_LOAD_PRODUCT3(5,kseq);

PR_LOAD_PRODUCT3(6,kseq);

PR_LOAD_PRODUCT3(7,kseq);

PR_LOAD_PRODUCT3(8,kseq);

PR_LOAD_PRODUCT3(9,kseq);

PR_LOAD_PRODUCT3(10,kseq);

PR_LOAD_PRODUCT3(11,kseq);


begin
for c_rec in (select * from s_test_1 where pkg_seq = kseq and
flg = 'ae' order by pkg_ord)
loop
   if substr(c_rec.run_sql,1,1) != '-' then
   PR_Msgs('*** '||c_rec.run_sql||' End OK...', pkg_name||'.'||'pr_main');
   else
   PR_Msgs(c_rec.run_sql, pkg_name||'.'||'pr_main');
   end if;
   insert into s_test_3
   values(sysdate,c_rec.run_sql,c_rec.pkg_seq,c_rec.pkg_ord,c_rec.prc_seq);
end loop;
end;

sql_stmnt:='insert into s_msgs_his select * from s_msgs where msg_ord > 0';

execute immediate sql_stmnt;

pkg_en_date := sysdate;

insert into s_package_run values (pkg_st_date,pkg_en_date,floor((pkg_en_date-pkg_st_date)*24*60),
(pkg_en_date-pkg_st_date)*24*60*60 - floor((pkg_en_date-pkg_st_date)*24*60)*60,gv_count,
pkg_name,null,dd);


end;

-- ==============================================================================================
-- ==============================================================================================

PROCEDURE PR_LOAD_PRODUCT3(pseq number, tseq number) is
sql_stmnt VARCHAR2(5000);
begin

prc_st_date := sysdate;

begin
for c_rec in (select * from s_test_1 where pkg_seq = tseq and
prc_seq = pseq and flg = 'bs' order by pkg_ord)
loop
   prc_name :=  c_rec.run_sql;
   PR_Msgs(c_rec.run_sql||' Started...', pkg_name||'.'||'pr_main');
   insert into s_test_3
   values(sysdate,c_rec.run_sql,c_rec.pkg_seq,c_rec.pkg_ord,c_rec.prc_seq);
end loop;
end;

begin
for c_rec in (select * from s_test_1 where pkg_seq = tseq and
prc_seq = pseq and flg = 'aa' order by pkg_ord)

loop
     sql_stmnt := c_rec.run_sql;
     execute immediate sql_stmnt;
     insert into s_test_3
     values(sysdate,c_rec.run_sql,c_rec.pkg_seq,c_rec.pkg_ord,c_rec.prc_seq);
end loop;
end;

begin
for c_rec in (select * from s_test_1 where pkg_seq = tseq and
prc_seq = pseq and flg = 'be' order by pkg_ord)
loop
   if substr(c_rec.run_sql,1,1) != '-' then
   PR_Msgs(c_rec.run_sql||' End OK...', pkg_name||'.'||'pr_main');
   else
   PR_Msgs(c_rec.run_sql, pkg_name||'.'||'pr_main');
   end if;
   insert into s_test_3
   values(sysdate,c_rec.run_sql,c_rec.pkg_seq,c_rec.pkg_ord,c_rec.prc_seq);
end loop;
end;


select cc into gv_count
from cr2_test_2;

prc_en_date := sysdate;

insert into s_procedure_run values (prc_st_date,prc_en_date,floor((prc_en_date-prc_st_date)*24*60),
(prc_en_date-prc_st_date)*24*60*60 - floor((prc_en_date-prc_st_date)*24*60)*60,gv_count,
prc_name,pkg_name,dd);

end;

-- ==============================================================================================
-- ==============================================================================================

PROCEDURE PR_Msgs(pv_msg varchar2, pv_point varchar2) as
cc number(5);
Begin


select s_pkg2_seq.nextval into cc from dual;

insert into s_msgs values (sysdate, pv_msg, pv_point, user, '','',cc);
commit;

End;

-- ==============================================================================================
-- ==============================================================================================


END S_PKG;
/

Может кто-нибудь помочь мне найти ошибку, поскольку я новичок в пакетах PL SQL?

1 Ответ

0 голосов
/ 11 ноября 2019

Насколько я могу судить, если вы скомпилировали пакет при подключении от имени пользователя B, и он был успешным, то единственной "неизвестной" информацией в это время является:

sql_stmnt:='truncate table s_msgs';

, т.е. таблицавы усекаете с помощью динамического SQL. sql_stmnt значение является строкой, компилятор не проверяет, что там. Но когда вы на самом деле выполняете , то обнаруживает, что в схеме пользователя B. нет таблицы s_msgs.

То же самое относится к

sql_stmnt:='insert into s_msgs_his select * from s_msgs where msg_ord > 0';

иtable s_msgs_his.

Когда вы переместили все из A в B, я думаю, вы должны сделать то же самое с этими таблицами. Сделайте это и попробуйте снова запустить свой код.

[РЕДАКТИРОВАТЬ]

Это строка 109:

for c_rec in (select * from s_test_1 where pkg_seq = tseq and
prc_seq = pseq and flg = 'aa' order by pkg_ord)

loop
     sql_stmnt := c_rec.run_sql;
     execute immediate sql_stmnt;         --> line 109

Проверьте, что написано вS_TEST_1. Выглядит как некая инструкция, которая должна выполняться динамически, но - включенная в нее таблица не существует в схеме B (или у пользователя нет прав на ее использование).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...