PL/SQL ORA-00903: 立即执行期间 table 名称无效
PL/SQL ORA-00903: invalid table name during EXECUTE IMMEDIATE
这是我的代码:
procedure test IS
tn varchar2(99);
i number(6);
cursor c1 is
select tname
from tab
where tabtype='TABLE'
and tname NOT LIKE 'BIN%'
order by tname;
begin
open c1;
loop
fetch c1 into tn;
exit when c1%notfound;
sq3 := 'select count(*) from '||tn;
EXECUTE IMMEDIATE sq3 INTO i;
htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
end loop;
close c1;
end test;
执行后我收到错误
Failed to execute target procedure
ORA-00903: invalid table name
对于这一行"EXECUTE IMMEDIATE sq3 INTO i;"
知道为什么吗?
提前致谢!
错误不言自明:
您尝试计算其行数的 table 个名称中的一个无效。
可以使用以下代码捕获异常并确定table的名称(您还需要声明sq3
变量):
procedure test
IS
sq3 CLOB;
tn varchar2(99);
i number(6);
cursor c1 is
select tname
from tab
where tabtype='TABLE'
and tname NOT LIKE 'BIN%'
order by tname;
invalid_table_name EXCEPTION;
PRAGMA EXCEPTION_INIT( invalid_table_name, -903 );
begin
open c1;
loop
fetch c1 into tn;
exit when c1%notfound;
BEGIN
sq3 := 'select count(*) from '||tn;
EXECUTE IMMEDIATE sq3 INTO i;
htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
EXCEPTION
WHEN invalid_table_name THEN
DBMS_OUTPUT.PUT_LINE( 'Invalid Table Name: ' || tn );
END;
end loop;
close c1;
end test;
您可能会发现 table 名称无效,因为它要么区分大小写,要么包含通常不会出现在 table 名称中的字符,并且您没有在 EXECUTE IMMEDIATE
语句。在这种情况下,您可以使用:
sq3 := 'select count(*) from "'||tn||'"';
这是我的代码:
procedure test IS
tn varchar2(99);
i number(6);
cursor c1 is
select tname
from tab
where tabtype='TABLE'
and tname NOT LIKE 'BIN%'
order by tname;
begin
open c1;
loop
fetch c1 into tn;
exit when c1%notfound;
sq3 := 'select count(*) from '||tn;
EXECUTE IMMEDIATE sq3 INTO i;
htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
end loop;
close c1;
end test;
执行后我收到错误
Failed to execute target procedure
ORA-00903: invalid table name
对于这一行"EXECUTE IMMEDIATE sq3 INTO i;"
知道为什么吗?
提前致谢!
错误不言自明:
您尝试计算其行数的 table 个名称中的一个无效。
可以使用以下代码捕获异常并确定table的名称(您还需要声明sq3
变量):
procedure test
IS
sq3 CLOB;
tn varchar2(99);
i number(6);
cursor c1 is
select tname
from tab
where tabtype='TABLE'
and tname NOT LIKE 'BIN%'
order by tname;
invalid_table_name EXCEPTION;
PRAGMA EXCEPTION_INIT( invalid_table_name, -903 );
begin
open c1;
loop
fetch c1 into tn;
exit when c1%notfound;
BEGIN
sq3 := 'select count(*) from '||tn;
EXECUTE IMMEDIATE sq3 INTO i;
htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
EXCEPTION
WHEN invalid_table_name THEN
DBMS_OUTPUT.PUT_LINE( 'Invalid Table Name: ' || tn );
END;
end loop;
close c1;
end test;
您可能会发现 table 名称无效,因为它要么区分大小写,要么包含通常不会出现在 table 名称中的字符,并且您没有在 EXECUTE IMMEDIATE
语句。在这种情况下,您可以使用:
sq3 := 'select count(*) from "'||tn||'"';