One case of DDL executed in PL/SQL

解决PL/SQL块中DDL语句错误及优化方法
本文解决了一个在PL/SQL块中执行DDL语句时遇到的错误,并提供了优化建议,包括避免使用SYS命名的索引、使用EXECUTE IMMEDIATE语句、排除LOB索引、避免循环操作等。
   
Please help me in resolving the error below

Code:
=====
DECLARE --count NUMBER;
tname NVARCHAR2(255);
indexname NVARCHAR2(255);
tablename NVARCHAR2(255);

--tname:= 'TABLE_PART_ACTION';


CURSOR indexCursor IS
SELECT index_name,table_name
FROM user_indexes where table_name='TABLE_PART_ACTION';

BEGIN

OPEN indexCursor;
LOOP
FETCH indexCursor INTO indexname, table_name;
EXIT WHEN indexCursor%NOTFOUND;


--select count INTO count from user_indexes where table_name=tname;

IF (indexname!='SYS_C0014096') then
dbms_output.put_line('Testing......');
DROP index indexname;
END IF;
END LOOP;
CLOSE indexCursor;
END;
/

Error:
=====
ORA-06550: line 25, column 6:
PLS-00103: Encountered the symbol "DROP" when expecting one of the following:

begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
pipe

===============

Solution

dineshmurs,

there's a couple of problems with your pl/sql block:

1.) As shammat already stated, you have to use "EXECUTE IMMEDIATE" for DDL statements in PL/SQL

2.) As it-iss stated, SYS_ named indexes should be avoided (they are not guaranteed to have the same name after i.e. exporting/importing a table)

3.) The "IF indexname != <whatever>" should be moved into the query for performance reasons

4.) In the query you should exclude LOB-indexes to avoid ORA-22864 errors

5.) Looping over cursors is one of the most efficient performance killers in PL/SQL.
The reason is, that every loop cycle generates 2 context switches (PLSQL->SQL and back).
Usually you will gain factors in performance by looping over a PL/SQL table instead.

6.) You should code this as stored procedure to avoid n SQL*Net roundtrips when deleting n indexes


My take on that (ignoring my own advise #6) would be:

Code:

-- tested on 11.2.0.1.0
DECLARE
  type tIndArr is table of user_indexes&#37;rowtype index by pls_integer;

  cursor indexCursor IS
       SELECT  *
       FROM    user_indexes
       WHERE   table_name    = 'TEST'
       AND     index_name   != 'PK_TEST'  -- index implementing the primary key, like your SYS_C0014096
       AND     index_type   != 'LOB';     -- avoid ORA-22864 on LOB indexes

       vIndArr  tIndArr;
       vCmdStr  varchar2(4000);

BEGIN
   OPEN  indexCursor;
   FETCH indexCursor bulk collect into vIndArr;
   CLOSE indexCursor;
   if vIndArr.COUNT > 0 then
      for i in vIndArr.FIRST..vIndArr.LAST loop
         vCmdStr := 'DROP INDEX ' || vIndArr(i).index_name;
         dbms_output.put_line('About to execute: ' || vCmdStr);
         execute immediate vCmdStr;
      END LOOP;
   end if;
END;


FROM

http://www.dbforums.com/oracle/1655591-getting-problem-while-executing-procedure.html

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值