小弟菜鸟一只,刚开始学存储过程,建立如下过程时没有报错,执行时报"ora-00900,无效的SQL语句"错误,SQL语句我试过没有问题,请大虾们赐教。create or replace procedure insert_records
begin
insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where saddr not in(select saddr from records);
commit;
end insert_records

解决方案 »

  1.   

    create or replace procedure insert_records
    is
    begin
    insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where saddr not in(select saddr from records);
    commit;
    end insert_records;
      

  2.   

    缺少IS关键字,过程编译位通过。
    另外,编译通过后确定你用户有v$session的select权限。否则又报
    PL/SQL: ORA-00942: 表或视图不存在
      

  3.   


    定义存储过程的语句有问题
    begin之前少个is另:一个简单的insert语句就没必要用存储过程来做了
      

  4.   

    yhuib,按你的语句还是一样的错误提示
      

  5.   

    csuxp2008,简单是简单,主要是想写个过程,定时执行用的
      

  6.   


    create or replace procedure insert_records 
    is 
    begin 
    insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where saddr not in(select saddr from records); 
    commit; 
    end insert_records; 
    /
    最后加个/试试
      

  7.   

    还报错?
    records 表存不存在?
    records表结构和select中列出来的是一样的吗?
    有v$session的select权限吗?
      

  8.   

    还是那样,语句我确定没有问题,我用的是ORALCE 10G
      

  9.   


    records表不存在或者不在当前模式下
      

  10.   

    执行的时候,创建时没有报错exec insert_records
      

  11.   

    records 表不是你当前用户创建的?
      

  12.   

    是的,建表建过程执行过程用的是同一个帐户,我在PL/SQL下做的
      

  13.   

    create or replace procedure insert_records 
    is 
    begin 
    insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where saddr not in(select saddr from records); 
    commit; 
    end insert_records;ora-00900:无效SQL语句
      

  14.   

    -- 是权限问题:要对数据字典v$session有查询权限的话,
    -- 必须给当前用户授予dba的权限,
    -- 或者创建一个用于查询v$session的普通视图,然后把这个普通视图的权限授予普通用户-- 解决方法一:
    -- 比如说:你当前是在scott用户下操作的话,先授权:
    conn / as sysdba;
    grant dba to scott;
    conn scott/tiger;create table records as select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where 1=2;  --创建表create or replace procedure insert_records
    is
      begin 
        insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from v$session where saddr not in(select saddr from records); 
      commit; 
    end insert_records;-- 解决方法二:
    conn / as sysdba;
    revoke dba from scott; -- 从scott用户收回dba权限
    create view v_session as select * from v$session;
    grant select on v_session to scott;
    conn scott/tiger;
    create table records as select saddr,schemaname,osuser,machine,program,action,logon_time from sys.v_session where 1=2;  --创建表create or replace procedure insert_records
    is
      begin 
        insert into records select saddr,schemaname,osuser,machine,program,action,logon_time from sys.v_session where saddr not in(select saddr from records); 
      commit; 
    end insert_records;exec insert_records;select * from records;
      

  15.   

    执行时用call insert_records();
      

  16.   

    执行时用call insert_records();
    我试过了