if else里面不能有CREATE TABLE

时间:2011-06-08 00:17:38

标签: sql oracle

当我运行此查询时

DECLARE
      num NUMBER;
BEGIN

    SELECT COUNT(*) INTO num FROM user_all_tables WHERE TABLE_NAME=upper('DatabaseScriptLog')
    ;

    IF num < 1 THEN

      CREATE TABLE DatabaseScriptLog 
      (ScriptIdentifier VARCHAR(100) NOT NULL,
       ScriptType VARCHAR(50), 
       StartDate TIMESTAMP, 
       EndDate TIMESTAMP, 
       PRIMARY KEY (ScriptIdentifier)
       );

    END IF;

END;

执行上述操作时,我得到以下内容:

  

PLS-00103:遇到符号   期待其中一个时“创造”   以下内容:

     

开始案例声明退出goto如果   loop mod null pragma raise return   使用&lt;&lt;选择更新关闭当前删除   获取锁定插入打开回滚
  savepoint set sql execute commit   forall合并管   06550. 00000 - “行%s,列%s:\ n%s”   *原因:通常是PL / SQL编译错误。

2 个答案:

答案 0 :(得分:10)

您不能像这样运行DDL语句。您需要使用动态SQL(EXECUTE IMMEDIATE)。

IF num < 1 THEN

  EXECUTE IMMEDIATE 'CREATE TABLE DatabaseScriptLog (ScriptIdentifier VARCHAR(100) NOT NULL, ScriptType VARCHAR(50), StartDate TIMESTAMP, EndDate TIMESTAMP, PRIMARY KEY (ScriptIdentifier))'

END IF;

答案 1 :(得分:0)

你不能像在SQLServer中那样做。您需要通过已存在于正确模式中的存储过程来执行创建代码。您将创建代码作为参数传递,具有正确权限的存储过程为您执行此操作。

我使用版本脚本通过运行由if-then子句分隔的模式更改操作来将模式更新为最新模式,以检查数据库的版本。在更改之后,它会增加版本,以便下一个if语句测试通过,依此类推。如果您是最新的并运行脚本,ifs将跳过所有更改代码。如果您的数据库版本为46,并且您运行的所有更改最多为50,则只执行代表版本47-50的块。

您可以立即执行但需要提升权限,我不建议这样做。

希望这有帮助。