try:
connect testmis/password
exec refreshindex;

解决方案 »

  1.   

    我是在system下建立的这个过程,
    我进入TESTMIS用户下,运行,错误依旧
    SQL> exec refreshindex;
    BEGIN refreshindex; END;*
    ERROR 位于第 1 行:
    ORA-00936: 缺少表达式
    ORA-06512: 在"TESTMIS.REFRESHINDEX", line 43
    ORA-06512: 在line 1
      

  2.   

    我以前用同样的方法建立了一个TESTP的过程,一切正常的,我想是不是这些sqlyu语句放在PROCEDURE中有什么要求啊
      

  3.   

    43          open dbcursor3 for 'select '||strTemp||' from '||strdbcursor1;
     44          fetch dbcursor3 into strdbcursor3;这个没有什么问题吗? 换成 open dbcursor3 for 'select 1 from dual';
          fetch dbcursor3 into strdbcursor3;试试
      

  4.   

    换成: 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;
    这句话能有什么错,单独执行时都可以的啊???
      

  5.   

    fetch dbcursor3 into strdbcursor3;
    这个返回的类型是否匹配呢?至返回一个字段?
      

  6.   

    我时将数据表中的所有字段读出放入一个CLOB字段中
      

  7.   

    strdbcursor3 varchar2(4000);
    我在TESTMIS下单独执行这段SQL,出现一样的错我在SYSTEM下单独执行这段SQL,则可以正常运行:PL/SQL 过程已成功完成。
      

  8.   

    你这样试试
    strSql := 'select '||strTemp||' from '||strdbcursor1;
    open dbcursor3 for strSql;
    ...........
      

  9.   

    你用system运行没有错误,而用TESTMIS运行报错,可能是该用户没有对这个表操作的权限,
    你看一下设置
      

  10.   

    我单独在SQL/PLUS中运行就没有错误,
    创建一个PROCEDURE,放在里面就有问题
      

  11.   

    我想,至少问题与“ open dbcursor3 for 'select '||strdbcursor2||' from '||strdbcursor1;  ”
    放在过程中有关,这是一个出发点
      

  12.   

    主要是: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;
      

  13.   

    好象是动态执行的sql语句,权限必须对象直接赋值,即你必须直接把选择对象的权限赋给你相操作的用户,建议用当前用户的对象就应该没有问题了吧!
    我想你最好在当前的用户模式下创建对象,也不要加前缀了再试试!所有的都是属于一个模式,看还有没有问题!
      

  14.   

    对,应该是用户的问题。你是用system建立的,testmis可能不能执行。个人意见。是来学习的。
      

  15.   

    将18,38两行declare需要定义的东西移到过程开始定义的地方定义不能在存储过程内部使用declare
      

  16.   

    我已经该成你所说的形式了,但是仍然有问题
    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
      

  17.   

    你的变量名使用的很乱啊
    [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]
      

  18.   

    问题反正就是:
    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下仍然是不行,