在 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 Edition 在Window上的安装
无法连接到Oracle Database 11g Express Edition