在过程中截断和插入不能一起工作

时间:2014-02-24 18:27:58

标签: oracle dynamic plsql

我需要截断表,然后使用过程在该表中插入数据。

然而,一个人喜欢dinamic sql,但另一个不喜欢:

create or replace 
procedure   RECREATE_AGGREGATE
AUTHID DEFINER
AS
BEGIN
    TRUNCATE TABLE AGGREGATE;    
    INSERT INTO AGGREGATE SELECT * FROM OLD_AGGREGATE;
END;

错误(6,14):PLS-00103:遇到以下其中一项时遇到符号“TABLE”:= =。 (@%;符号“:=在”TABLE“之前插入以继续。

如果我在execute immediate语句周围添加TRUNCATE,它可以正常工作,但插入错误。 如果我删除它,TRUNCATE TABLE会抱怨...

create or replace 
    procedure   RECREATE_AGGREGATE
    AUTHID DEFINER
    AS
    BEGIN
        execute immediate 'TRUNCATE TABLE AGGREGATE';    
        INSERT INTO AGGREGATE SELECT * FROM OLD_AGGREGATE;
    END;

错误(7,5):PL / SQL:忽略SQL语句     错误(7,84):PL / SQL:ORA-00942:表或视图不存在

有些人可以在这里说清楚吗?

1 个答案:

答案 0 :(得分:6)

create or replace 
procedure   RECREATE_AGGREGATE
AUTHID DEFINER
AS
BEGIN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE AGGREGATE';    
    INSERT INTO AGGREGATE SELECT * FROM OLD_AGGREGATE;
END;
假设您拥有适当的权限,

将起作用。

根据您的编辑(以及回应@ OracleUser的评论),您可能会因运行INSERT语句而收到错误,因为old_aggregate归其他用户所有,而您只有SELECT通过角色在该表上的特权。如果您想在定义者权限存储过程中执行某些操作,则需要直接向您授予这些权限(或者使用12c,这样可以授予代码块而不是用户权限。)

假设您要使用定义者权限存储过程,则需要old_aggregate(或DBA)的所有者

GRANT SELECT 
   ON old_user.old_aggregate
   TO new_user;

您可以通过禁用会话的角色来验证您是否仅通过角色拥有该权限。如果你这样做,我会打赌

SQL> set role none;
SQL> SELECT * FROM old_aggregate

您也会收到ORA-00942错误。这是模拟定义者权限存储过程中用户可以使用的权限的好方法。