在自动生成的 sqldeveloper 脚本中检查 'VARCHAR2' = 'NUMBER' 的目的是什么?

What is the purpose of the checks like 'VARCHAR2' = 'NUMBER' in auto-generated sqldeveloper scripts?

我意识到 sqldeveloper 程序使用了一些我以前在创建自动生成的 SQL 脚本时从未见过的检查,这对我来说毫无意义。有谁知道他们的目的吗?例如 'VARCHAR2' = 'NUMBER' 比较。

begin
  if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('100')>0 then
    execute immediate 'alter table "MYTABLE" add(COLUMN1 VARCHAR2(, 100))';
  elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('100')=0) or
    'VARCHAR2' = 'VARCHAR2' then
    execute immediate 'alter table "MYTABLE" add(COLUMN1 VARCHAR2(100))';
  else
    execute immediate 'alter table "MYTABLE" add(COLUMN1 VARCHAR2)';
  end if;
end;
/

我的猜测是系统使用动态生成的代码,该代码来自固定格式,其中包含某种占位符,或者更有可能是变量连接:

EXECUTE IMMEDIATE 'ALTER TABLE "' || TABLENAME || " ADD ...';

一个列类型可以有三种格式:

  • TYPENAME
  • TYPENAME(param1)
  • TYPENAME(param1, param2)

...他们有一个模板,通过仔细计算比较来涵盖所有三种情况。

查询大概是这样写的:

begin
  if '&type' = 'NUMBER'
     and length('&type')>0
     and length('&size')>0
  then
    execute immediate 'alter table "&tablename" add(&columnname &type(&scale, &size))';
  elsif (   '&type' = 'NUMBER'
         and length('&type')>0
         and length('&size')=0
        )
        or '&type' = 'VARCHAR2'
  then
    execute immediate 'alter table "&tablename" add(&columnname &type(&size))';
  else
    execute immediate 'alter table "&tablename" add(&columnname &type)';
  end if;
end;
/

您将看到应用替换变量后的输出。