警告:创建的过程带有编译错误

时间:2022-06-15 14:58:34
create or replace procedure create_table as
begin
execute immediate 
'create table emp2(
id number,
name varchar2(10),
salary number)'; --动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;
/

不知道那里出现问题了?

24 个解决方案

#1


将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。

#2



create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;

#3


引用 1 楼 hidanger521 的回复:
将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。


修改之后这样,运行还是出现这个提示。
create or replace procedure create_table as
begin
execute immediate 
'create table emp2(
id number,
name varchar2(10),
salary number)'; --动态SQL为DDL语句
execute immediate  'insert into emp2
values (100,'jacky',5600)';
execute immediate '
insert into emp2
values (101,'rose',3000)';
execute immediate '
insert into emp2
values (102,'john',4500)';
end create_table;
/

#4


引用 2 楼 hidanger521 的回复:

create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;


原来还得加个引号,谢谢了

#5


引用 3 楼 jiang11034 的回复:
Quote: 引用 1 楼 hidanger521 的回复:

将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。


修改之后这样,运行还是出现这个提示。
create or replace procedure create_table as
begin
execute immediate 
'create table emp2(
id number,
name varchar2(10),
salary number)'; --动态SQL为DDL语句
execute immediate  'insert into emp2
values (100,'jacky',5600)';
execute immediate '
insert into emp2
values (101,'rose',3000)';
execute immediate '
insert into emp2
values (102,'john',4500)';
end create_table;
/

'引号得转义,用我给你写的那个

#6


create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

#7


引用 6 楼 gleiyu 的回复:
create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

没有写错,name一列的数据 再加上单引号就行了

#8


引用 7 楼 jiang11034 的回复:
Quote: 引用 6 楼 gleiyu 的回复:

create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

没有写错,name一列的数据 再加上单引号就行了

没注意看,这段SQL编译能通过,执行时候会报错。找不到表或者视图。二楼说的是对的

#9


引用 2 楼 hidanger521 的回复:

create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

#10


引用 9 楼 jiang11034 的回复:
Quote: 引用 2 楼 hidanger521 的回复:


create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

你可以看看,需要create any table权限

#11


权限不足就不是代码的问题了,根据提示权限不足的位置,可以对应给用户对应的权限。

#12


引用 10 楼 hidanger521 的回复:
Quote: 引用 9 楼 jiang11034 的回复:

Quote: 引用 2 楼 hidanger521 的回复:


create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

你可以看看,需要create any table权限

单独试了一下创建表的语句,是可以成功的

#13


单独试验所有的sql都好用么。。你把提示的权限不足内容贴出来看看。。

#14


引用 11 楼 hidanger521 的回复:
权限不足就不是代码的问题了,根据提示权限不足的位置,可以对应给用户对应的权限。


给了权限之后 就可以了。还是存在迷惑,为什么sql 命令执行就可以创建表,而在执行存储过程就不能。

#15


引用 13 楼 hidanger521 的回复:
单独试验所有的sql都好用么。。你把提示的权限不足内容贴出来看看。。


SQL> exec createtable;
BEGIN createtable; END;

*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SCOTT.CREATETABLE", line 3
ORA-06512: 在 line 1

对于单独创建表的sql语句是可行的。
SQL> create table pp(
  2  id number(4));

表已创建。

#16


你是再scott下执行的是么,我试一下。。

#17


是的。后来换到system as sysdba下就正常运行了

#18


我才试验了一下,只要scott有create any table权限,就可以正常执行。。

#19


引用 18 楼 hidanger521 的回复:
我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。

#20


引用 19 楼 jiang11034 的回复:
Quote: 引用 18 楼 hidanger521 的回复:

我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。


-- Grant/Revoke role privileges 
grant connect to SCOTT;
grant resource to SCOTT;
-- Grant/Revoke system privileges 
grant create any table to SCOTT;
grant unlimited tablespace to SCOTT;

上面是我scott的所有权限,运行存储过程没问题,你再试试吧。。

#21


引用 20 楼 hidanger521 的回复:
Quote: 引用 19 楼 jiang11034 的回复:

Quote: 引用 18 楼 hidanger521 的回复:

我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。


-- Grant/Revoke role privileges 
grant connect to SCOTT;
grant resource to SCOTT;
-- Grant/Revoke system privileges 
grant create any table to SCOTT;
grant unlimited tablespace to SCOTT;

上面是我scott的所有权限,运行存储过程没问题,你再试试吧。。

你使用了grant create any table to SCOTT;  加了这个权限,当然是可以的啦.

#22


。。。你不加肯定是不可以的了。。。 警告:创建的过程带有编译错误

#23


哎,你纠结的是这个啊。。
oracle就是这么设计的,再存储过程中必须显示的授权。
也是管理最终用户,区别于其他角色的一种策略。。

#24


引用 23 楼 hidanger521 的回复:
哎,你纠结的是这个啊。。
oracle就是这么设计的,再存储过程中必须显示的授权。
也是管理最终用户,区别于其他角色的一种策略。。


呵呵.你这样实现,和下面的实现的方式应该也是可以达到同样的效果
connect scott as sysdba
不纠结了。

#1


将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。

#2



create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;

#3


引用 1 楼 hidanger521 的回复:
将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。


修改之后这样,运行还是出现这个提示。
create or replace procedure create_table as
begin
execute immediate 
'create table emp2(
id number,
name varchar2(10),
salary number)'; --动态SQL为DDL语句
execute immediate  'insert into emp2
values (100,'jacky',5600)';
execute immediate '
insert into emp2
values (101,'rose',3000)';
execute immediate '
insert into emp2
values (102,'john',4500)';
end create_table;
/

#4


引用 2 楼 hidanger521 的回复:

create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;


原来还得加个引号,谢谢了

#5


引用 3 楼 jiang11034 的回复:
Quote: 引用 1 楼 hidanger521 的回复:

将insert 语句也修改成execute immediate方式执行。否则回提示表不存在。。
因为编译的时候还寻找不到表对象。。


修改之后这样,运行还是出现这个提示。
create or replace procedure create_table as
begin
execute immediate 
'create table emp2(
id number,
name varchar2(10),
salary number)'; --动态SQL为DDL语句
execute immediate  'insert into emp2
values (100,'jacky',5600)';
execute immediate '
insert into emp2
values (101,'rose',3000)';
execute immediate '
insert into emp2
values (102,'john',4500)';
end create_table;
/

'引号得转义,用我给你写的那个

#6


create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

#7


引用 6 楼 gleiyu 的回复:
create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

没有写错,name一列的数据 再加上单引号就行了

#8


引用 7 楼 jiang11034 的回复:
Quote: 引用 6 楼 gleiyu 的回复:

create or replace procedure create_table as
begin
execute immediate
'create table emp2(
id number,
name varchar2(10),
salary number
)';--动态SQL为DDL语句
insert into emp2
values (100,'jacky',5600);
insert into emp2
values (101,'rose',3000);
insert into emp2
values (102,'john',4500);
end create_table;

执行通过,没有报错啊。
楼主看看是不是你的英文符号哪里写成了中文的了

没有写错,name一列的数据 再加上单引号就行了

没注意看,这段SQL编译能通过,执行时候会报错。找不到表或者视图。二楼说的是对的

#9


引用 2 楼 hidanger521 的回复:

create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

#10


引用 9 楼 jiang11034 的回复:
Quote: 引用 2 楼 hidanger521 的回复:


create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

你可以看看,需要create any table权限

#11


权限不足就不是代码的问题了,根据提示权限不足的位置,可以对应给用户对应的权限。

#12


引用 10 楼 hidanger521 的回复:
Quote: 引用 9 楼 jiang11034 的回复:

Quote: 引用 2 楼 hidanger521 的回复:


create or replace procedure create_table as
 begin
 execute immediate 
 'create table emp2(
 id number,
 name varchar2(10),
 salary number)'; --动态SQL为DDL语句
 execute immediate 'insert into emp2
 values (100,''jacky'',5600)';
 execute immediate 'insert into emp2
 values (101,''rose'',3000)';
 execute immediate 'insert into emp2
 values (102,''john'',4500)';
 end create_table;



这段代码是没有问题的,现在出现另外一种情况
执行这个存储过程,提示权限不足。
我同样的情况创建另外的存储过程是可以正常执行的。是不是代码本身的问题?

你可以看看,需要create any table权限

单独试了一下创建表的语句,是可以成功的

#13


单独试验所有的sql都好用么。。你把提示的权限不足内容贴出来看看。。

#14


引用 11 楼 hidanger521 的回复:
权限不足就不是代码的问题了,根据提示权限不足的位置,可以对应给用户对应的权限。


给了权限之后 就可以了。还是存在迷惑,为什么sql 命令执行就可以创建表,而在执行存储过程就不能。

#15


引用 13 楼 hidanger521 的回复:
单独试验所有的sql都好用么。。你把提示的权限不足内容贴出来看看。。


SQL> exec createtable;
BEGIN createtable; END;

*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SCOTT.CREATETABLE", line 3
ORA-06512: 在 line 1

对于单独创建表的sql语句是可行的。
SQL> create table pp(
  2  id number(4));

表已创建。

#16


你是再scott下执行的是么,我试一下。。

#17


是的。后来换到system as sysdba下就正常运行了

#18


我才试验了一下,只要scott有create any table权限,就可以正常执行。。

#19


引用 18 楼 hidanger521 的回复:
我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。

#20


引用 19 楼 jiang11034 的回复:
Quote: 引用 18 楼 hidanger521 的回复:

我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。


-- Grant/Revoke role privileges 
grant connect to SCOTT;
grant resource to SCOTT;
-- Grant/Revoke system privileges 
grant create any table to SCOTT;
grant unlimited tablespace to SCOTT;

上面是我scott的所有权限,运行存储过程没问题,你再试试吧。。

#21


引用 20 楼 hidanger521 的回复:
Quote: 引用 19 楼 jiang11034 的回复:

Quote: 引用 18 楼 hidanger521 的回复:

我才试验了一下,只要scott有create any table权限,就可以正常执行。。

不知道,我试了一下 sql语句就可以创建表,上面的存储过程就不行。权限提升之后就可以正常运行。


-- Grant/Revoke role privileges 
grant connect to SCOTT;
grant resource to SCOTT;
-- Grant/Revoke system privileges 
grant create any table to SCOTT;
grant unlimited tablespace to SCOTT;

上面是我scott的所有权限,运行存储过程没问题,你再试试吧。。

你使用了grant create any table to SCOTT;  加了这个权限,当然是可以的啦.

#22


。。。你不加肯定是不可以的了。。。 警告:创建的过程带有编译错误

#23


哎,你纠结的是这个啊。。
oracle就是这么设计的,再存储过程中必须显示的授权。
也是管理最终用户,区别于其他角色的一种策略。。

#24


引用 23 楼 hidanger521 的回复:
哎,你纠结的是这个啊。。
oracle就是这么设计的,再存储过程中必须显示的授权。
也是管理最终用户,区别于其他角色的一种策略。。


呵呵.你这样实现,和下面的实现的方式应该也是可以达到同样的效果
connect scott as sysdba
不纠结了。