在存储过程中的所有操作都必须直接显式授权,不能通过角色授权。你必须把 CREATE TABLE 权限显式授予创建 plsql 的这个用户。

解决方案 »

  1.   

    grant create table to plsql
      

  2.   

    楼上的我也不是很清楚,可不可以说的详细点啊
    EXECUTE immediate v_sql 提示权限不足
    应该怎么修改,或怎么设置
      

  3.   

    1. 直接grant create table to user.用户的create table权限是通过role赋予的, 在plsql中通过role赋予的权限是不能生效的..2. Oracle中有专门的global temporary table供使用, 为什么每次运行存储过程都重建呢..是不是可以考虑改造成使用global temporary table呢..
      

  4.   

    楼上的兄弟我还是不是很清楚,我在网上也看到过“grant create table to 用户”但是这个是用到哪里,就放在存储过程里面吗(对不起我刚学习ORACLE,由于马上需要解决问题,所以来不急很系统的看书学习,也只能希望各位兄弟很明确的告诉我。)
    比如存储过程:sSQL:='CREATE TABLE (name varchar2(4000))';
    EXECUTE IMMEDIATE sSQL;--提示没权限
    应该怎么修改.
      

  5.   

    楼主,
    jame说的就是:
    1)就是sqlplus进去后,给你用作创建表这个用户赋权,使他有创建表的权限,那么在存储过程里就可以直接创建表了,带*的那个老大说的也是这个意思2)就是使用oracle'本身的创建临时表的功能,没有必要在存储过程里创建
    嘿嘿,也不知道偶解释的对不对。
      

  6.   

    再问个问题
    如果要用游标访问这个临时表结果提示表不存在
    create or replace procedure .....
    as
       CURSOR curRole  IS 
       SELECT * FROM tt_TMP;   ---提示表tt_TMP不存在
    begin
    sSQL:='CREATE TABLE (tt_TMP varchar2(4000))';
    EXECUTE IMMEDIATE sSQL;
    end;
    这个该怎么解决
      

  7.   

    你的tt_TMP表由哪个用户所有的?
    create or replace procedure .....这个过程又是哪个用户所有?
      

  8.   

    在sqlplus中创建全局临时表. create global temporary table gtt_tbl_name (
      col type,
      ....
    )
    on commit preserve rows | delete rows可以在存储过程中使用这个临时表, 表的结构是persistent的.. 里面的数据根据on commit后面的结果决定是session级别/事务级别..
      

  9.   

    第二个问题:
    如果是写存储过程,在cursor里用到了一个没有的表或者所属不对的表是编译不过去的
    就是说这个过程处于不可用状态。