43 open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1; 44 fetch dbcursor3 into strdbcursor3;这个没有什么问题吗? 换成 open dbcursor3 for 'select 1 from dual'; fetch dbcursor3 into strdbcursor3;试试
换成: open dbcursor3 for 'select 1 from dual'; 屏蔽掉: recNum:=recNum+1; 47 insert into testmis.zindex_info (编号,数据库编码,分类编码,表编码,内容) values 48 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3); 执行就没有正常了? open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1; 这句话能有什么错,单独执行时都可以的啊???
fetch dbcursor3 into strdbcursor3; 这个返回的类型是否匹配呢?至返回一个字段?
我想,至少问题与“ open dbcursor3 for 'select '||strdbcursor2||' from '||strdbcursor1; ” 放在过程中有关,这是一个出发点
主要是:open dbcursor3 for 'select '||strdbcursor2||' from '||strdbcursor1; 独立执行没有问题,放入过程中就不对了 declare type dbcur is ref cursor; dbcursor3 dbcur; strdbcursor3 varchar2(10000); begin open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1; fetch dbcursor3 into strdbcursor3; while dbcursor3%found loop recNum:=recNum+1; insert into testmis.zindex_info (编号,数据库编码,分类编码,表编码,内容) values (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3); fetch dbcursor3 into strdbcursor3; end loop; close dbcursor3; end;
我已经该成你所说的形式了,但是仍然有问题 SQL> create or replace procedure testmis.refreshindex 2 as 3 strdbcursor1 varchar2(50); 4 strTemp varchar2(5000); 5 recNum number(15); 6 cursor dbcursor1 is select 表编码 from testmis.zbm_dict,testmis.zfl_dict 7 where 保密级别>1 and testmis.zbm_dict.分类编码=testmis.zfl_dict.分类编码 8 and testmis.zfl_dict.数据库编码='FXHY'; 9 strdbcursor2 varchar2(50); 10 cursor dbcursor2(strp varchar2) is select COLUMN_NAME from user_col_comments where upp er(TABLE_NAME)=upper(strp); 11 type dbcur is ref cursor; 12 dbcursor3 dbcur; 13 strdbcursor3 varchar2(5000); 14 begin 15 recNum:=0; 16 delete testmis.ZINDEX_Info; 17 open dbcursor1; 18 fetch dbcursor1 into strdbcursor1; 19 while dbcursor1%found 20 loop /* 读取表字段 */ 21 strTemp:=''; 22 open dbcursor2(strdbcursor1); 23 fetch dbcursor2 into strdbcursor2; 24 while dbcursor2%found loop 25 26 if strTemp is null then 27 strTemp:=TRIM(strdbcursor2); 28 else 29 strTemp:=strTemp||'||'' ''|| '||TRIM(strdbcursor2); 30 end if; 31 fetch dbcursor2 into strdbcursor2; 32 end loop; 33 close dbcursor2; 34 35 /*插入数据到索引信息表中*/ 36 open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1; 37 fetch dbcursor3 into strdbcursor3; 38 while dbcursor3%found loop 39 recNum:=recNum+1; 40 insert into TESTMIS.ZINDEX_Info (编号,数据库编码,分类编码,表编码,内容) values 41 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3); 42 fetch dbcursor3 into strdbcursor3; 43 end loop; 44 close dbcursor3; 45 46 fetch dbcursor1 into strdbcursor1; 47 end loop; 48 close dbcursor1; 49 end; 50 51 52 /过程已创建。SQL> alter procedure testmis.refreshindex compile;过程已更改。SQL> exec testmis.refreshindex; BEGIN testmis.refreshindex; END;* ERROR 位于第 1 行: ORA-00936: 缺少表达式 ORA-06512: 在"TESTMIS.REFRESHINDEX", line 36 ORA-06512: 在line 1
你的变量名使用的很乱啊 [code] 36 open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1; 37 fetch dbcursor3 into strdbcursor3; 38 while dbcursor3%found loop 39 recNum:=recNum+1; 40 insert into TESTMIS.ZINDEX_Info (编号,数据库编码,分类编码,表编码,内容) values 41 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3); 42 fetch dbcursor3 into strdbcursor3; 43 end loop; 44 close dbcursor3; 45 46 fetch dbcursor1 into strdbcursor1;/*这是什么意思啊*/ 47 end loop; 48 close dbcursor1; 49 end; [/code]
问题反正就是: open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;的问题 我试过了与system的权限无关,因为:相应的SQL语句单独运行在system下没有问题,在TESTMIS下运行 错误: ERROR 位于第 1 行: ORA-00936: 缺少表达式 ORA-06512: 在line 35 如果我改为:open dbcursor3 for 'select table_name from all_tables';,整个过程运行在SYSTEM下也是正常的,在TESTMIS下仍然是不行,
我进入TESTMIS用户下,运行,错误依旧
SQL> exec refreshindex;
BEGIN refreshindex; END;*
ERROR 位于第 1 行:
ORA-00936: 缺少表达式
ORA-06512: 在"TESTMIS.REFRESHINDEX", line 43
ORA-06512: 在line 1
44 fetch dbcursor3 into strdbcursor3;这个没有什么问题吗? 换成 open dbcursor3 for 'select 1 from dual';
fetch dbcursor3 into strdbcursor3;试试
屏蔽掉: recNum:=recNum+1;
47 insert into testmis.zindex_info (编号,数据库编码,分类编码,表编码,内容) values
48 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3); 执行就没有正常了?
open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;
这句话能有什么错,单独执行时都可以的啊???
这个返回的类型是否匹配呢?至返回一个字段?
我在TESTMIS下单独执行这段SQL,出现一样的错我在SYSTEM下单独执行这段SQL,则可以正常运行:PL/SQL 过程已成功完成。
strSql := 'select '||strTemp||' from '||strdbcursor1;
open dbcursor3 for strSql;
...........
你看一下设置
创建一个PROCEDURE,放在里面就有问题
放在过程中有关,这是一个出发点
独立执行没有问题,放入过程中就不对了
declare
type dbcur is ref cursor;
dbcursor3 dbcur;
strdbcursor3 varchar2(10000);
begin
open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;
fetch dbcursor3 into strdbcursor3;
while dbcursor3%found loop
recNum:=recNum+1;
insert into testmis.zindex_info (编号,数据库编码,分类编码,表编码,内容) values
(recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3);
fetch dbcursor3 into strdbcursor3;
end loop;
close dbcursor3;
end;
我想你最好在当前的用户模式下创建对象,也不要加前缀了再试试!所有的都是属于一个模式,看还有没有问题!
SQL> create or replace procedure testmis.refreshindex
2 as
3 strdbcursor1 varchar2(50);
4 strTemp varchar2(5000);
5 recNum number(15);
6 cursor dbcursor1 is select 表编码 from testmis.zbm_dict,testmis.zfl_dict
7 where 保密级别>1 and testmis.zbm_dict.分类编码=testmis.zfl_dict.分类编码
8 and testmis.zfl_dict.数据库编码='FXHY';
9 strdbcursor2 varchar2(50);
10 cursor dbcursor2(strp varchar2) is select COLUMN_NAME from user_col_comments where upp
er(TABLE_NAME)=upper(strp);
11 type dbcur is ref cursor;
12 dbcursor3 dbcur;
13 strdbcursor3 varchar2(5000);
14 begin
15 recNum:=0;
16 delete testmis.ZINDEX_Info;
17 open dbcursor1;
18 fetch dbcursor1 into strdbcursor1;
19 while dbcursor1%found
20 loop /* 读取表字段 */
21 strTemp:='';
22 open dbcursor2(strdbcursor1);
23 fetch dbcursor2 into strdbcursor2;
24 while dbcursor2%found loop
25
26 if strTemp is null then
27 strTemp:=TRIM(strdbcursor2);
28 else
29 strTemp:=strTemp||'||'' ''|| '||TRIM(strdbcursor2);
30 end if;
31 fetch dbcursor2 into strdbcursor2;
32 end loop;
33 close dbcursor2;
34
35 /*插入数据到索引信息表中*/
36 open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;
37 fetch dbcursor3 into strdbcursor3;
38 while dbcursor3%found loop
39 recNum:=recNum+1;
40 insert into TESTMIS.ZINDEX_Info (编号,数据库编码,分类编码,表编码,内容) values
41 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3);
42 fetch dbcursor3 into strdbcursor3;
43 end loop;
44 close dbcursor3;
45
46 fetch dbcursor1 into strdbcursor1;
47 end loop;
48 close dbcursor1;
49 end;
50
51
52 /过程已创建。SQL> alter procedure testmis.refreshindex compile;过程已更改。SQL> exec testmis.refreshindex;
BEGIN testmis.refreshindex; END;*
ERROR 位于第 1 行:
ORA-00936: 缺少表达式
ORA-06512: 在"TESTMIS.REFRESHINDEX", line 36
ORA-06512: 在line 1
[code]
36 open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;
37 fetch dbcursor3 into strdbcursor3;
38 while dbcursor3%found loop
39 recNum:=recNum+1;
40 insert into TESTMIS.ZINDEX_Info (编号,数据库编码,分类编码,表编码,内容) values
41 (recNum,'FXHY','FXHY_NULL',strdbcursor1,strdbcursor3);
42 fetch dbcursor3 into strdbcursor3;
43 end loop;
44 close dbcursor3;
45
46 fetch dbcursor1 into strdbcursor1;/*这是什么意思啊*/
47 end loop;
48 close dbcursor1;
49 end;
[/code]
open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;的问题
我试过了与system的权限无关,因为:相应的SQL语句单独运行在system下没有问题,在TESTMIS下运行
错误:
ERROR 位于第 1 行:
ORA-00936: 缺少表达式
ORA-06512: 在line 35
如果我改为:open dbcursor3 for 'select table_name from all_tables';,整个过程运行在SYSTEM下也是正常的,在TESTMIS下仍然是不行,