【问题标题】:truncate and insert within procedure don't work together在过程中截断和插入不能一起工作
【发布时间】:2014-02-24 18:27:57
【问题描述】:

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

但是,一个喜欢动态 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:表或视图不存在

这里有什么可以说明的吗?

【问题讨论】:

  • 尝试在 truncate 语句周围使用 execute immediate。这应该不会影响您的插入(可能有其他问题,但您需要发布错误代码)。

标签: oracle dynamic plsql


【解决方案1】:
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 由另一个用户拥有,并且您仅通过角色。如果你想在定义者的权限存储过程中做某事,你需要将这些权限直接授予你(或者使用 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 错误。这是在定义者权限存储过程中模拟用户可以使用哪些权限的好方法。

【讨论】:

  • 我已经知道了。我还需要什么其他特权。因为现在,这不起作用... :( 错误(6,14):PLS-00103:在期望以下之一时遇到符号“TABLE”::=。(@%;符号“:=”是在“TABLE”之前插入以继续。
  • @Angelina - 哪个用户拥有这两个表中的每一个?哪个用户拥有该程序?您正在运行的产生此错误的实际代码是什么?考虑到代码,错误消息没有多大意义。
  • Cove:AGGREGATE 由 (caller_user) 调用过程的同一用户拥有。 (caller_user) 对 OLD_AGGREGATE 具有选择权限。那是没有意义的,因为如果我在程序之外运行它,它会完美地工作。也许在过程中权限不存在...?
  • @Angelina 我希望您通过角色获得该表的特权。从过程调用时,必须直接授予使用权限。
  • @Angelina - 我更新了我的答案。我相信 OracleUser 是正确的——您可能仅通过角色拥有权限,而不是通过必要的直接授权。
【解决方案2】:

“TRUNCATE 是 DDL(数据定义语言)。您不能在 PL/SQL 中执行 DDL。” http://www.orafaq.com/forum/t/119427

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多