【问题标题】:Oracle Stored Procedure with Alter command带有 Alter 命令的 Oracle 存储过程
【发布时间】:2011-01-30 22:22:28
【问题描述】:

我正在尝试构建一个接受表名作为参数的 Oracle 存储过程。然后该过程将重建表上的所有索引。

我的问题是在存储过程中使用 ALTER 命令时出现错误,好像 PLSQL 不允许该命令。

【问题讨论】:

  • 你能发布违规代码吗?
  • 很高兴知道 ORA 错误,以及您正在使用的 Oracle 版本以及您尝试使用的代码。
  • 只是好奇,您接受的答案实际上是如何回答您的问题的?
  • 您好,Will,这个网站不仅是一个问答论坛,它还是一个维基 - 旨在帮助每个人。世界各地的人们都得到了帮助,不仅是那些回答问题的人,还有那些提出问题的人(比如你自己)。您可以通过添加诸如 ORA 错误和 Oracle 版本之类的详细信息来帮助他人,当您接受答案时,请说明该答案如何帮助您。分享和享受!

标签: sql oracle stored-procedures plsql


【解决方案1】:

使用execute immediate 语句在PL/SQL 中执行DDL。

create procedure RebuildIndex(index_name varchar2) as
begin
   execute immediate 'alter index ' || index_name || ' rebuild';
end;

我测试了这段代码;它有效。

【讨论】:

    【解决方案2】:

    Documentation.

    将架构对象名称作为参数传递

    假设您需要一个过程 接受任何数据库的名称 表,然后从您的表中删除该表 架构。您必须使用 包含对象的语句 名称,然后使用 EXECUTE IMMEDIATE 来 执行语句:

    CREATE TABLE employees_temp AS SELECT last_name FROM employees;
    CREATE PROCEDURE drop_table (table_name IN VARCHAR2) AS
    BEGIN
      EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
    END;
    /
    

    使用连接来构建字符串, 而不是试图通过桌子 通过名称作为绑定变量 USING 子句。

    另外,如果你需要调用一个 名称未知的过程,直到 运行时,你可以传递一个参数 识别程序。为了 例如,下面的过程可以 通过调用另一个过程(drop_table) 指定过程名称时 执行。

    CREATE PROCEDURE run_proc (proc_name IN VARCHAR2, table_name IN VARCHAR2) ASBEGIN
       EXECUTE IMMEDIATE 'CALL "' || proc_name || '" ( :proc_name )' using table_name;
    END;
    /
    

    如果你想删除一个表 drop_table 过程,您可以运行 程序如下。请注意, 过程名称大写。

    CREATE TABLE employees_temp AS SELECT last_name FROM employees;
    BEGIN 
      run_proc('DROP_TABLE', 'employees_temp'); 
    END;
    /
    

    【讨论】:

      【解决方案3】:

      这里有几种可能性。首先,您必须将 SQL 视为动态 SQL。其次,Oracle DDL 语句不能在事务中运行(或者,它们终止当前事务并且自身不能回滚)。这可能会影响您是否可以在存储过程中使用它们,或者在哪里可以使用包含它们的存储过程。

      如果以上都不适用 - 很容易有其他东西误入歧途 - 我建议发布一些代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        • 2013-11-02
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多