如何修复此“忽略 SQL 语句”错误?
Posted
技术标签:
【中文标题】如何修复此“忽略 SQL 语句”错误?【英文标题】:How can I fix this "SQL Statement ignored" error? 【发布时间】:2010-06-24 19:20:13 【问题描述】:我有以下无法编译的小函数:
function f_query_01 Return interval Day to second is
start_time timestamp(3);
end_time timestamp(3);
time_diff interval Day to second;
c_query_number number;
begin
start_time := systimestamp;
select count(*) into c_query_number from wg; <--This is the line that errors out
end_time := systimestamp;
time_diff := start_time - end_time;
return time_diff;
end f_query_01;
编译器给我以下错误:
Error(29,3): PL/SQL: SQL Statement ignored
Error(29,44): PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here
是什么导致了这个错误,我该如何解决?
【问题讨论】:
select count(*) into c_query_number from wg;
在与函数相同的数据库/模式中运行时,是否在函数之外工作?
有趣。它尝试了这段代码,将 wg 替换为另一个小表。编译运行成功。你确定这正是有问题的代码吗?
问题是wg表不存在。一旦我将表重命名为正确的名称,一切都很好。在这种情况下,我真的觉得错误消息非常具有误导性,这种情况确实发生了,但仍然令人沮丧。
“语句被忽略”消息意味着编译器尝试编译其余部分,就好像提到的语句不存在一样,因此可能会发生更多错误,例如当该行开始循环时。
[2015-07-12 16:38:48] [65000][6550] ORA-06550:第 2 行,第 3 列:PLS-00905:对象 MARTIN.WS11_A5_LOOPER 无效 ORA-06550:第 2 行第 3 列:PL/SQL:语句被忽略
【参考方案1】:
似乎 wg 表不存在。当更新为正确的表名时,编译工作不会出错。来自 table 的编译器的消息不存在将是最有帮助的。
【讨论】:
我认为错误信息背后的原因是,如果对象不在数据字典中,那么它必须是本地定义的对象,因此是“过程、函数、包或类型”,即都是可以用函数定义的东西。 编译代码时,出现“表不存在”错误。当我有一个名为 wg 的函数时编译它时,我得到了描述的错误。也许某个地方有另一个“wg”的公共同义词。【参考方案2】:CREATE OR REPLACE FUNCTION f_query_01
RETURN NUMBER
IS
BEGIN
DECLARE
c_query_number NUMBER DEFAULT NULL;
start_time DATE DEFAULT NULL;
end_time DATE DEFAULT NULL;
time_diff NUMBER DEFAULT NULL;
BEGIN
SELECT CAST (SYSTIMESTAMP AS DATE) INTO start_time FROM DUAL;
SELECT COUNT (*) INTO c_query_number FROM ws;
SELECT CAST (SYSTIMESTAMP AS DATE) INTO end_time FROM DUAL;
time_diff := start_time - end_time;
RETURN time_diff;
END;
END f_query_01;
【讨论】:
以上是关于如何修复此“忽略 SQL 语句”错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复此 MYSQL//Phpmyadmin 错误? [复制]