有没有办法结合SELECT和ALTER语句(结合DML和DDL)?

时间:2019-04-17 19:00:01

标签: sql oracle plsql ddl

我想动态地重命名索引。

背景故事:如果基表具有主键(我认为呢),Oracle会在物化视图上自动创建索引。每次删除和创建MV时,该索引的名称都会更改。我想重命名该索引。

我的计划是选择索引名称,然后将其放入alter语句中。

Select table_owner||'.'||INDEX_Name 
  from all_indexes
 WHERE table_name = 'mytable' 
   and table_owner = 'myuser' 
   and uniqueness = 'UNIQUE';
ALTER INDEX (that select statement here) 
  RENAME TO abetterindexname

但是抛出了这个错误:

ORA-00953: missing or invalid index name

发布之前,我已经弄清楚了答案。这是有效的方法:

DECLARE
avariable  varchar2(100);
BEGIN
Select table_owner||'.'||INDEX_Name 
  into avariable  
  from all_indexes
 WHERE table_name = 'mytable' 
   and table_owner = 'myuser' 
   and uniqueness = 'UNIQUE';
execute immediate 'ALTER INDEX '||avariable||' RENAME TO abetterindexname';
 END;

资料来源:https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:7038453003289。 -我必须为执行立即执行语句构建一个字符串。

如果有人知道如何仅使用sql来做到这一点,我会很感兴趣。

2 个答案:

答案 0 :(得分:2)

您无法在SQL中执行此操作。 SQL是一种查询语言。 您只能使用DDL之类的

ALTER INDEX <old name> RENAME TO <new name>

或带有动态sql的plsql

begin
  execute immediate 'ALTER INDEX '||<old name>||' RENAME TO '|| <new name>;
end;

答案 1 :(得分:1)

可以使用新的12c WITH函数在纯SQL语句中运行DDL。

以下语句是使用公用表表达式的普通SELECT语句。但是,该公用表表达式引用了运行SQL语句的函数。该代码不需要安装任何对象,并且可以在SELECT上下文中运行。

with function exec_sql(p_sql varchar2) return number is
    pragma autonomous_transaction;
begin
    execute immediate p_sql;
    return 1;
end;
select exec_sql('ALTER INDEX '||owner||'.'||index_name||' RENAME TO abetterindexname')
from all_indexes
where table_name = 'MYTABLE'
    and table_owner = owner
    and uniqueness = 'UNIQUE';
/

但是不建议在SELECT语句中运行这样的更改。 Oracle不保证执行SELECT语句的各个部分的确切顺序和次数(尽管实际上我们通常可以弄清楚这一点)。在PL / SQL匿名块中运行更改要安全得多。该技术可能仅对我们访问数据库的权限有限的情况有用,例如仅运行SELECT语句的工具。