【发布时间】:2012-11-19 10:59:43
【问题描述】:
在之前的一篇文章中,我在编译下面的过程时遇到了一些问题(它应该根据作者编写的任务数量来更新属性profile) - 现在,它确实编译了(尽管有警告)并且当我尝试执行它时,它失败了。我不知道为什么。我正在使用 ExecuteQuery 连接到远程 Oracle 数据库。该过程涉及的表是:
Task(TaskID, ..., AuthorID)
Author(AuthorID, profile, name, ...)
这是程序(我的具体问题如下):
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';
CREATE OR REPLACE PROCEDURE profil_stufe
IS
CURSOR c1 IS SELECT AuthorID, COUNT(AuthorID) as Total FROM Task
GROUP BY AuthorID;
result INTEGER c1%ROWTYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO result;
EXIT WHEN c1%NOTFOUND;
IF(result.Total = 2 OR result.Total = 3) THEN
UPDATE Author SET profile = 'Advanced' WHERE AuthorID = result.AuthorID;
END IF;
IF(result.Total >= 4) THEN
UPDATE Author SET profile = 'proficient' WHERE AuthorID = result.AuthorID;
END IF;
END LOOP;
CLOSE c1;
END;
我的问题:
首先,我无法检索编译过程时产生的警告。我尝试了
select plsql_warnings from user_plsql_object_settings ps where ps.name = 'profil_stufe';或select * from user_errors ur where ur.name = 'profil_stufe';之类的查询,但都没有提供任何结果,即使该过程在编译时出现警告。当我执行
execute profil_stufe时出现错误
ORA-06550:第 1 行,第 16 列:PLS-00905:对象 CS261_20.PROFIL_STUFE 无效 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略
有人可以帮帮我吗?我知道,我可以避免创建过程并以其他方式实现相同的功能。但似乎我缺少一些 PL/SQL 的基本概念,我真的很想了解它们……所以,感谢您的帮助!
【问题讨论】:
-
作为它的解析,为了将来的引用,默认情况下对象名应该是大写的。即
select * from user_errors ur where ur.name = 'PROFIL_STUFE';(只有在创建了带有双引号的对象时才使用混合/小写,例如create procedure "profil_stufe"(在oracle 中不推荐)
标签: oracle stored-procedures plsql