调用存储过程错误,必须声明标识符

njpolice001 2010-11-01 08:55:53
代码如下:
SQL> CREATE OR REPLACE PROCEDURE test IS
2 tmpVar NUMBER;
3 strSQL varchar2(2000);
4 BEGIN
5 strSQL := 'drop table local_xx';
6 execute immediate strSQL;
7
8 strSQL := 'create table local_xx as select * from xt_dba.xx@dblink_xt where sj between '|| chr(39) || 20091221 || chr(39) || ' and ' || chr(39) || 20101101235959 || chr(39);
9 execute immediate strSQL;
10
11 strSQL := 'DROP INDEX DDCXD.IDX_XX_BH';
12 execute immediate strSQL;
13
14 strSQL :='CREATE INDEX DDCXD.IDX_XX_BH ON DDCXD.LOCAL_XX (JJBH)'
15 ||'LOGGING'
16 ||'TABLESPACE DDCXD'
17 ||'PCTFREE 10'
18 ||'INITRANS 2'
19 ||'MAXTRANS 255'
20 ||'STORAGE ('
21 ||' INITIAL 64K'
22 ||' MINEXTENTS 1'
23 ||' MAXEXTENTS UNLIMITED'
24 ||' PCTINCREASE 0'
25 ||' BUFFER_POOL DEFAULT'
26 ||' )'
27 ||'NOPARALLEL';
28 execute immediate strSQL;
29 END test;
30 /

过程已创建。

SQL> exec text
BEGIN text; END;

*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'TEXT'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored


求助,该如何解决啊?
...全文
1457 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
心中的彩虹 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 njpolice001 的回复:]
代码如下:
SQL> CREATE OR REPLACE PROCEDURE test IS
2 tmpVar NUMBER;
3 strSQL varchar2(2000);
4 BEGIN
5 strSQL := 'drop table local_xx';
6 execute immediate strSQL;
7
8 strSQL := 'c……
[/Quote]

SQL> exec text
BEGIN text; END;

你的过程名叫 test
exec test
碧水幽幽泉 2010-11-01
  • 打赏
  • 举报
回复
楼上已经解决了!可以结贴了!
xman_78tom 2010-11-01
  • 打赏
  • 举报
回复


for c in (select null from user_indexes where index_name='IDX_XX_BH') loop
execute immediate 'drop index DDCXD.IDX_XX_BH';
end loop

strSQL :='CREATE INDEX DDCXD.IDX_XX_BH ON DDCXD.LOCAL_XX (JJBH)'||chr(10)
||'LOGGING'||chr(10)
||'TABLESPACE DDCXD'||chr(10)
||'PCTFREE 10'||chr(10)
||'INITRANS 2'||chr(10)
||'MAXTRANS 255'||chr(10)
||'STORAGE ('||chr(10)
||' INITIAL 64K'||chr(10)
||' MINEXTENTS 1'||chr(10)
||' MAXEXTENTS UNLIMITED'||chr(10)
||' PCTINCREASE 0'||chr(10)
||' BUFFER_POOL DEFAULT'||chr(10)
||' )'||chr(10)
||'NOPARALLEL';
execute immediate strSQL;
njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhuomingwang 的回复:]
引用 12 楼 njpolice001 的回复:
引用 11 楼 xman_78tom 的回复:
创建索引报错,在TOAD里运行过程还是报错。
错误信息是什么?

toad里运行过程,EXEC TEST
结果:无效的SQL语句

SQLPLUS里运行
前边抓取没有问题,后面建立索引错误为
ora-00905缺失关键字
ora-06512在“ddcxd.test”,line 1……
[/Quote]


修改过了,索引都用默认的,代码如下
SQL> CREATE INDEX DDCXD.IDX_XX_BH ON DDCXD.LOCAL_XX (BH)
2 /

索引已创建。

SQL> CREATE OR REPLACE PROCEDURE DDCXD.test AUTHID CURRENT_USER IS
2 tmpVar NUMBER;
3 strSQL varchar2(2000);
4 BEGIN
5 strSQL := 'drop table local_xx';
6 execute immediate strSQL;
7 strSQL := 'create table local_xx as select * from xt_dba.xx@dblink_xt where rqsj between '|| chr(39) || 20091221 || chr(39) || ' and ' || chr(39) || 20101101235959 || chr(39);
8 execute immediate strSQL;
9 strSQL := 'DROP INDEX DDCXD.IDX_XX_BH';
10 execute immediate strSQL;
11 strSQL :='CREATE INDEX DDCXD.IDX_XX_BH ON DDCXD.LOCAL_XX (BH)';
12 execute immediate strSQL;
13 END test;
14 /

过程已创建。

SQL> EXEC TEST
BEGIN TEST; END;

*
第 1 行出现错误:
ORA-01418: 指定的索引不存在
ORA-06512: 在 "DDCXD.TEST", line 10
ORA-06512: 在 line 1
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 njpolice001 的回复:]
引用 11 楼 xman_78tom 的回复:
创建索引报错,在TOAD里运行过程还是报错。
错误信息是什么?

toad里运行过程,EXEC TEST
结果:无效的SQL语句

SQLPLUS里运行
前边抓取没有问题,后面建立索引错误为
ora-00905缺失关键字
ora-06512在“ddcxd.test”,line 10
ora-06512在 line 1

然……
[/Quote]1、无效的sql语句 exec是sqlplus里的命令 在toad没有
2、你创建索引的拼接语句有问题
14 strSQL :='CREATE INDEX DDCXD.IDX_XX_BH ON DDCXD.LOCAL_XX (JJBH)'
15 ||' LOGGING '
16 ||' TABLESPACE DDCXD'
17 ||' PCTFREE 10'
18 ||' INITRANS 2'
19 ||' MAXTRANS 255'
20 ||' STORAGE (' --上面几行少了空格,建议以后可以将拼接的语句打印出来 一看就知道了
21 ||' INITIAL 64K'
22 ||' MINEXTENTS 1'
23 ||' MAXEXTENTS UNLIMITED'
24 ||' PCTINCREASE 0'
25 ||' BUFFER_POOL DEFAULT'
26 ||' )'
27 ||'NOPARALLEL';
njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xman_78tom 的回复:]
创建索引报错,在TOAD里运行过程还是报错。
错误信息是什么?
[/Quote]
toad里运行过程,EXEC TEST
结果:无效的SQL语句

SQLPLUS里运行
前边抓取没有问题,后面建立索引错误为
ora-00905缺失关键字
ora-06512在“ddcxd.test”,line 10
ora-06512在 line 1

然后发现抓取的表正常,先前建立的索引被删除后再次创建失败
xman_78tom 2010-11-01
  • 打赏
  • 举报
回复
创建索引报错,在TOAD里运行过程还是报错。
错误信息是什么?


njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhuomingwang 的回复:]
你单独执行下创建索引的语句试试
[/Quote]

单独执行后显示已创建
  • 打赏
  • 举报
回复
你单独执行下创建索引的语句试试
njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhuomingwang 的回复:]
exec 好像是sqlplus命令
[/Quote]

那索引在过程中该如何创建?
按照我那个思路,准备在空闲时段从远程服务器抓取一批数据回来分析,需要建表同时创建索引,每天一次,每次执行时需要把以前的删除掉。
就是这么个过程。
  • 打赏
  • 举报
回复
exec 好像是sqlplus命令
njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhuomingwang 的回复:]
引用 3 楼 njpolice001 的回复:
引用 1 楼 zhuomingwang 的回复:
SQL code
exec test--你的过程名写错了



暴汗啊,太大意了,找了半天错误,不过在toad里运行报错,说无效的SQL语句,不知道是怎么回事啊,SQLPLUS里边运行的很好


SQL code
你用 begin
test;
end --试试这样
[/Quote]

整个过程在数据抓取的时候没有问题,创建索引报错,这里索引应该怎么弄啊?
还有在TOAD里运行过程还是报错
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 njpolice001 的回复:]
引用 1 楼 zhuomingwang 的回复:
SQL code
exec test--你的过程名写错了



暴汗啊,太大意了,找了半天错误,不过在toad里运行报错,说无效的SQL语句,不知道是怎么回事啊,SQLPLUS里边运行的很好
[/Quote]
你用 begin
test;
end --试试这样
gelyon 2010-11-01
  • 打赏
  • 举报
回复
BEGIN
test; --注意你的过错名!
END
njpolice001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhuomingwang 的回复:]
SQL code
exec test--你的过程名写错了
[/Quote]


暴汗啊,太大意了,找了半天错误,不过在toad里运行报错,说无效的SQL语句,不知道是怎么回事啊,SQLPLUS里边运行的很好
xman_78tom 2010-11-01
  • 打赏
  • 举报
回复
PROCEDURE test ???
sql> exec test;
  • 打赏
  • 举报
回复
exec test--你的过程名写错了

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧