在 Oracle 11g Express 中执行过程显示错误

Posted

技术标签:

【中文标题】在 Oracle 11g Express 中执行过程显示错误【英文标题】:Executing a procedure in Oracle 11g Express showing error 【发布时间】:2013-04-19 20:11:43 【问题描述】:

我使用 Oracle 和 System 作为用户名。我创建了一个名为 STUDY 的数据库。 我使用以下 SQL 语句创建了一个名为 LIB 的表:

create table lib(
book varchar(20)
);

我使用以下 SQL 语句创建了一个过程名称 SUB:

create or replace procedure SUB( sbook IN VARCHAR)
as
begin
insert into LIB values(sbook);
end;
/

我还通过以下 SQL 语句授予 EXECUTE 权限:

grant EXECUTE on SUB to system;

现在,当我尝试使用以下 SQL 语句执行 SUB 过程时:

execute STUDY.SUB ('mybook');

我收到以下错误:

ORA-00900: invalid SQL statement

这个错误的原因是什么?

【问题讨论】:

【参考方案1】:

执行为

begin
execute STUDY.SUB ('mybook');
end;

【讨论】:

execute 是一个 SQL*Plus 和 SQL 开发人员命令,为方便起见,它在单个命令周围包装了一个简单的 begin ... end。它不是您可以从 PL/SQL BLOCK 内部调用的东西。不要与动态 SQL 的“立即执行”混淆...【参考方案2】:

首先,绝对最低限度为SYSTEM 帐户,并且不要在该架构(或任何其他内置架构,尤其是SYS)下创建对象。

如果您以SYSTEM 运行所有这些命令,那么您在SYSTEM 架构下创建了SUB 过程,而不是STUDY 架构。你还没有创建STUDY数据库,这不是 Oralce 做事的方式;您已经通过创建用户创建了 schema。 (至少,我认为这就是你所做的,你有可能在一个名为 STUDY 的数据库中完成所有这些工作,但我对此表示怀疑)。

你可能应该做的是:

connect study/password
create table lib ( ... );
create or replace peocedure ( ... );
/
execute sub( ... );

如果您正在尝试授权,那么您需要创建第二个用户,例如 USER2,仍然是 STUDY

grant execute on sub to user2;

然后以第二个用户的身份连接并执行该过程:

connect user2/password
execute study.sub ( ... );

将 privs 授予 SYSTEM 是不寻常的,通常只会对普通用户和角色进行。

【讨论】:

以上是关于在 Oracle 11g Express 中执行过程显示错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ORACLE 11G EXPRESS 版命令行中保存数据? [复制]

oracle 11g express 版本的使用问题

Oracle 11g Express Edition 在Window上的安装

无法连接到Oracle Database 11g Express Edition

oracle 11G R2 Express Edition支持多少个会话/连接?

Oracle 11g Express