Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有一种方法可以组合SELECT和ALTER语句(组合DML和DDL)?_Sql_Oracle_Plsql_Ddl - Fatal编程技术网

Sql 有没有一种方法可以组合SELECT和ALTER语句(组合DML和DDL)?

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

我想动态重命名索引

后台故事:如果基表有主键(我想是吧?),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;
资料来源:.--我必须为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
语句的工具。

您应该选择问题并将答案路径移动到您随后接受的答案。