Oracle程序中的Oracle合并分区给出错误

时间:2009-04-13 09:55:34

标签: oracle

  CREATE OR REPLACE PROCEDURE test
  AS
  sql_stmt  VARCHAR2(200);
  BEGIN
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;

  END ;
  /

上述程序给出了以下错误 -

ORA-01031: insufficient privileges
ORA-06512: at "test", line 8
ORA-06512: at line 6

但是如果我直接在sql提示符下运行ALTER Command,我没有收到任何错误.. 我想知道我需要什么权限才能让用户从程序中执行合并。

4 个答案:

答案 0 :(得分:1)

我使用AUTHID CURRENT_USER

解决了这个问题
CREATE OR REPLACE PROCEDURE test AUTHID CURRENT_USER
  AS
  sql_stmt  VARCHAR2(200);
  BEGIN
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;

  END ;
  /

答案 1 :(得分:0)

注意:永远不要在存储过程中使用DDL。下面是应该避免设计非常非常糟糕的代码的示例。

CREATE OR REPLACE PROCEDURE test
AS
sql_stmt  VARCHAR2(200);
BEGIN
     sql_stmt := 'GRANT ALTER ON daily_table TO your_user';
     EXECUTE IMMEDIATE sql_stmt;
     sql_stmt := 'ALTER TABLE daily_table PARTITIONS p1 , p2 into PARTITION p2';
     EXECUTE IMMEDIATE sql_stmt;
END ;
/

答案 2 :(得分:0)

我确信如果有人为DDL专门创建了一个存储过程,那么他们就会意识到它是自动提交的。

答案 3 :(得分:0)

我在存储过程中使用DDL:最常见的是截断过程将重新填充的汇总表;不时地为DDLish任务,例如重命名导入表的列以符合Oracle的标识符标准规则,或者为命名表创建主键和序列。一般我用

dbms_utility.exec_ddl_statement(blah);

而不是

EXECUTE IMMEDIATE blah;

偏见我不会试图证明这一点。我要说的是,Oracle提供并记录的打包程序表明不应全面禁止。