Sql 有没有一种方法可以组合SELECT和ALTER语句(组合DML和DDL)?
我想动态重命名索引 后台故事:如果基表有主键(我想是吧?),Oracle会在物化视图上自动创建索引。每次删除和创建MV时,该索引的名称都会更改。我想重命名那个索引 我的计划是选择索引名,然后将其放入alter语句中Sql 有没有一种方法可以组合SELECT和ALTER语句(组合DML和DDL)?,sql,oracle,plsql,ddl,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 = 'UNI
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;
资料来源:.--我必须为executeimmediate语句构建一个字符串
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
如果有人知道如何只用sql来实现这一点,我会很感兴趣。你不能用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;
开始
立即执行“ALTER INDEX”| | |重命名为“| |”;
结束;
可以使用带有函数的新12c在纯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
语句的工具。您应该选择问题并将答案路径移动到您随后接受的答案。