当我运行此查询时
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编译错误。
答案 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的块。
您可以立即执行但需要提升权限,我不建议这样做。
希望这有帮助。