2016-02-25 25 views
0

如何使用DDL语句跟踪PL/SQL块?如何使用DDL语句跟踪PL/SQL块

我试图做这样的事情:

DECLARE TRESULT INTEGER; 

BEGIN 

    SELECT COUNT(1) INTO TRESULT 
    FROM USER_INDEXES 
    WHERE INDEX_NAME='IX_SalesmanID'; 

    IF TRESULT > 0 THEN 
    EXECUTE IMMEDIATE 'DROP INDEX IX_SalesmanID'; 
    END IF; 

END; 

CREATE INDEX IX_SalesmanID ON Salesmen(SalesmanID); 

但我得到一个错误信息:

Error report: 
ORA-06550: line 15, column 1: 
PLS-00103: Encountered the symbol "CREATE" 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 

我应该是块之外,虽然,对不对?

这是一个非常简化的版本,实际的脚本会检查是否存在很多事物,并删除,重新创建并反复更改许多对象及其许多属性。把它们全部放入动态SQL字符串中并使用EXECUTE IMMEDIATE看起来好像过度杀毒。

我在做一些简单的错误尝试关闭上面的例子中的块吗?

感谢您的任何帮助。

+2

把一个 '/'(斜杠符号)之后 “END;” – MaxU

+1

就像需要思考的东西一样,除非您正在进行迁移,否则在Oracle中反复删除和重新创建对象对于生产环境来说不是一个好习惯,并且可能表明您正在尝试解决的问题尚未完全想到。 – kevinsky

+0

任何时候当你发现自己想要在pl/sql块中执行DDL时,都应该从键盘上推回去,去喝一杯咖啡,然后重新思考你在做什么。我永远不会说,但这是一个巨大的红旗,你正在采取错误的做法。这当然是其中的一种情况。 – EdStevens

回答

5

;终止PL/SQL语句和一个/在SQL范围终止PL/SQL块:

DECLARE 
    TRESULT INTEGER; 
BEGIN 
    SELECT COUNT(1) 
    INTO TRESULT 
    FROM USER_INDEXES 
    WHERE INDEX_NAME='IX_SALESMANID'; -- All UPPERCASE 

    IF TRESULT > 0 THEN 
    EXECUTE IMMEDIATE 'DROP INDEX IX_SalesmanID'; 
    END IF; 
END; 
/

CREATE INDEX IX_SalesmanID ON Salesmen(SalesmanID); 
+0

哦,是的;谢谢。自从我使用Oracle代替SQL Server或其他数据库以来,已经有好几年了。 –