我需要截断表,然后使用过程在该表中插入数据.
但是,一个人喜欢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