create or replace procedure pro_temp2
(
GWOID in number, --岗位OID
GZOID in number --规则OID

as
v_KPIName varchar2(500); --KPI名称
v_PersonnelOID number(12); --员工OID
v_PersonnelName varchar2(500); --员工姓名
v_sql varchar2(1000); --动态sql
v_SqlLength integer; --sql长度
type mycursor is ref cursor; --循环游标
Info mycursor; 
begin
v_sql := 'select (select bzjc from zh_khgz where oid=zh_jxkhgzmx.KPIOID) as gzmc from zh_jxkhgzmx where zboid='||GZOID;
open Info for v_sql;
v_sql := 'CREATE GLOBAL TEMPORARY TABLE T_TEMP2 (员工OID number(12),员工姓名 varchar2(50),';
fetch Info into v_KPIName;
while Info % found 
loop
v_sql := v_sql || v_KPIName || ' varchar2(50), ';
fetch Info into v_KPIName;
end loop;
close Info; 
v_SqlLength := length(v_sql);
v_sql := substr(v_sql,0,v_SqlLength - 2);
v_sql := v_sql || ') ON COMMIT delete ROWS';
execute immediate(v_sql);
v_sql := 'select oid,name from zh_ryda where zh_gwoid='||GWOID;
open Info for v_sql;
fetch Info into v_PersonnelOID,v_PersonnelName;
while Info % found
loop
fetch Info into v_PersonnelOID,v_PersonnelName;
execute immediate 'insert into T_TEMP2 values('''||v_PersonnelOID||''','''||v_PersonnelName||''')';
end loop;
close Info;
open Info for 'select * from T_TEMP2';
end pro_temp2;
上面的存储过程可以编译通过,但是在测试的时候,每当运行到
execute immediate(v_sql);时就提示权限不足,请问这个需要哪种权限?

解决方案 »

  1.   

    conn sys/change_on_install
    grant create any table to username;
      

  2.   

    我把execute immediate(v_sql)里面的那个sql单独拿出来,放在pl/sql里又可以创建,请问这个是怎么回事??
      

  3.   

    存储过程如下:
    create or replace procedure pro_temp3
    (
    GWOID in number, --岗位OID
    GZOID in number --规则OID

    as
    v_KPIName varchar2(500); --KPI名称
    v_PersonnelOID number(12); --员工OID
    v_PersonnelName varchar2(500); --员工姓名
    v_Exist integer; --判断是否存在 
    v_sql varchar2(1000); --动态sql
    v_SqlLength integer; --sql长度
    type mycursor is ref cursor; --循环游标
    Info mycursor; 
    begin
    v_Exist := 0;
    select count(*) into v_Exist from USER_TAB_COLUMNS where lower(TABLE_NAME)='t_performance';
    if v_Exist >= 1 then
    v_sql := 'drop table t_performance';
    execute immediate v_sql;
    end if;
    v_sql := 'CREATE TABLE t_performance(员工OID number(12),员工姓名 varchar2(50))';
    execute immediate v_sql;
    end pro_temp3;
    我测试上面的存储过程,当 t_performance表存在时,可以drop掉这个表,但是我执行到下面的
    v_sql := 'CREATE TABLE t_performance(员工OID number(12),员工姓名 varchar2(50))';
    execute immediate v_sql;
    的时候却提示权限不足,为什么这个用户可以drop表而不能新建表了?