加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-03-05 23:02:19 所属栏目:站长百科 来源:网络整理
导读:我需要截断表,然后使用过程在该表中插入数据. 但是,一个人喜欢dinamic sql而另一个不喜欢: create or replace procedure RECREATE_AGGREGATEAUTHID DEFINERASBEGIN TRUNCATE TABLE AGGREGATE; INSERT INTO AGGREGATE SELECT * FROM OLD_AGGREGATE;END; 错误

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

但是,一个人喜欢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“之前插入以继续.

如果我在TRUNCATE语句周围添加execute immediate,它工作正常,但插入错误输出.
如果我删除它,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:表或视图不存在

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

解决方法

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,这样可以授予代码块而不是用户权限).

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

GRANT SELECT 
   ON old_user.old_aggregate
   TO new_user;

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

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

你也会得到一个ORA-00942错误.这是模拟定义者权限存储过程中用户可用权限的好方法.

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读