如何在oracle中有条件地执行脚本?

时间:2016-12-09 04:44:05

标签: oracle compiler-errors execute-immediate

我有一个很长的DDL数据迁移脚本,它有15个事务块。对于每个块,它从一个表中获取数据,然后插入另一个表中。

但现在我遇到了数据库没有该表的情况。在这种情况下,我的脚本甚至无法编译。

我真正想要的是如果表不存在则检查并提前返回。如果是,则只继续执行。

但是脚本甚至没有编译,因为它的语句包含一个在该特定数据库中不存在的表名。

经过一些谷歌搜索后,我发现我们可以在EXECUTE IMMEDIATE块中使用这些语句。我试过这个,但还是没能把它编译好。

这是块 -

DECLARE
  V_OBJECT_NAME1 VARCHAR2(50);
   V_STRING VARCHAR2(1000);
  V_CONTINUE  Boolean;  
BEGIN
  V_CONTINUE := true; 
  SELECT TABLE_NAME INTO V_OBJECT_NAME1 FROM USER_TABLES  WHERE TABLE_NAME = 'OOLD_SFWID_CHG_LOG_HEADER';
EXCEPTION WHEN NO_DATA_FOUND THEN
    V_CONTINUE := false;


IF V_CONTINUE then
   --scubbber code
   V_STRING := 'DECLARE
   CURSOR C1 IS
          SELECT * FROM OOLD_SFWID_CHG_LOG_HEADER;
   BEGIN
          OPEN C1;
          CLOSE C1;
   END;';
   EXECUTE IMMEDIATE V_STRING
END IF;
END;

DECLARE V_OBJECT_NAME1 VARCHAR2(50); V_STRING VARCHAR2(1000); V_CONTINUE Boolean; BEGIN V_CONTINUE := true; SELECT TABLE_NAME INTO V_OBJECT_NAME1 FROM USER_TABLES WHERE TABLE_NAME = 'OOLD_SFWID_CHG_LOG_HEADER'; EXCEPTION WHEN NO_DATA_FOUND THEN V_CONTINUE := false; IF V_CONTINUE then --scubbber code V_STRING := 'DECLARE CURSOR C1 IS SELECT * FROM OOLD_SFWID_CHG_LOG_HEADER; BEGIN OPEN C1; CLOSE C1; END;'; EXECUTE IMMEDIATE V_STRING END IF; END;

请建议我们如何写它..

0 个答案:

没有答案