Ang*_*ina 5 oracle plsql dynamic
我需要截断表,然后使用过程在该表中插入数据.
但是,一个人喜欢dinamic sql,但另一个不喜欢:
create or replace
procedure RECREATE_AGGREGATE
AUTHID DEFINER
AS
BEGIN
TRUNCATE TABLE AGGREGATE;
INSERT INTO AGGREGATE SELECT * FROM OLD_AGGREGATE;
END;
Run Code Online (Sandbox Code Playgroud)
错误(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;
Run Code Online (Sandbox Code Playgroud)
错误(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;
Run Code Online (Sandbox Code Playgroud)
假设你有适当的特权,我们会工作.
根据您的编辑(以及回显@ OracleUser的评论),您可能会INSERT
因运行语句而收到错误,因为old_aggregate
它由另一个用户拥有,并且您只SELECT
通过角色拥有该表的权限.如果您想在定义者权限存储过程中执行某些操作,则需要将这些权限直接授予您(或者使用12c,这样可以授予代码块而不是用户权限).
假设您要使用定义者权限存储过程,则需要old_aggregate
(或DBA)的所有者
GRANT SELECT
ON old_user.old_aggregate
TO new_user;
Run Code Online (Sandbox Code Playgroud)
您可以通过禁用会话的角色来验证您是否仅通过角色拥有该权限.如果你这样做,我会打赌
SQL> set role none;
SQL> SELECT * FROM old_aggregate
Run Code Online (Sandbox Code Playgroud)
你也会得到一个ORA-00942错误.这是模拟定义者权限存储过程中用户可用权限的好方法.
归档时间: |
|
查看次数: |
8973 次 |
最近记录: |