为什么 SQL 开发人员建议为一个有效的过程使用不同的格式?

ell*_*men 3 oracle

这是我的原始程序,效果很好:

create or replace PROCEDURE EXTRACT_0_CPP AS
    CURSOR c_data IS
        SELECT cpp,
               rfu1,
               rfu2,
               mean_rfu,
               charge_ph7_4,
               hydropathy
        FROM   cpp
        ORDER BY LENGTH(cpp);
    F1 UTL_FILE.FILE_TYPE;

BEGIN 
    F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
                          filename => '0_cpp.TXT',
                          open_mode => 'w',
                          max_linesize => 32767);
    FOR cur_rec IN c_data LOOP 
        UTL_FILE.PUT_LINE (F1, 
                            cur_rec.cpp || ':' ||
                            cur_rec.rfu1 || ':' ||
                            cur_rec.rfu2 || ':' ||
                            cur_rec.mean_rfu || ':' ||
                            cur_rec.charge_ph7_4 || ':' ||
                            cur_rec.hydropathy);                     
    END LOOP;
    UTL_FILE.FCLOSE(F1);
END;

Run Code Online (Sandbox Code Playgroud)

但是 SQL Developer 在下面给了我一条波浪状的红线,SELECT并建议我将其更改为:

create or replace PROCEDURE EXTRACT_0_CPP AS
    CURSOR c_data IS
        SELECT
    "A1"."CPP"         "CPP",
    "A1"."RFU1"           "RFU1",
    "A1"."RFU2"           "RFU2",
    "A1"."MEAN_RFU"       "MEAN_RFU",
    "A1"."CHARGE_PH7_4"   "CHARGE_PH7_4",
    "A1"."HYDROPATHY"     "HYDROPATHY"
FROM
    "C##ELLIE"."CPP" "A1"
ORDER BY
    length("A1"."CPP");
    F1 UTL_FILE.FILE_TYPE;

BEGIN 
    F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
                          filename => '0_cpp.TXT',
                          open_mode => 'w',
                          max_linesize => 32767);
    FOR cur_rec IN c_data LOOP 
        UTL_FILE.PUT_LINE (F1, 
                            cur_rec.pk_cpp || ':' ||
                            cur_rec.rfu1 || ':' ||
                            cur_rec.rfu2 || ':' ||
                            cur_rec.mean_rfu || ':' ||
                            cur_rec.charge_ph7_4 || ':' ||
                            cur_rec.hydropathy);                     
    END LOOP;
    UTL_FILE.FCLOSE(F1);
END;
Run Code Online (Sandbox Code Playgroud)

我的问题是(为什么)这更好?什么是“A1”?

Wil*_*son 5

关于为什么在代码已经可以工作的情况下会建议不同的格式的主题,当然有可能有格式错误的代码可以工作,所以原则上没有理由不考虑布局或重构改进,这可能会使代码更健壮、高效或更易于维护。

然而,双引号的名称是不好的做法,因为它们隐藏了命名错误并强制您指定大写/小写,结果比原来的可读性差。它们确实是一种可移植性功能,可与具有奇怪表名的第三方应用程序一起使用。代码生成器倾向于在所有内容周围加上双引号,因为这样做比检测在每种情况下是否确实需要它们更容易。没有办法

from "C##ELLIE"."CPP" "A1"
Run Code Online (Sandbox Code Playgroud)

是否有任何改进

from cpp
Run Code Online (Sandbox Code Playgroud)

除了可能使用表别名。给表一个别名(没有双引号!)并在引用列时使用它是个好主意。但是"A1"(甚至a1)是只有计算机才能想到的那种表别名。使用表名的某种缩写形式的别名会好得多,在这种情况下可能是c。想象一下,如果你加入了六张桌子——现在是哪一张a3?哦对了,就是ORDER_DETAILS。(虽然在这种情况下,表名太短了,没有必要给它取别名。)所以,

SELECT "A1"."CPP" "CPP"
FROM   "C##ELLIE"."CPP" "A1"
Run Code Online (Sandbox Code Playgroud)

会好得多

SELECT c.cpp
FROM   cpp c
Run Code Online (Sandbox Code Playgroud)

(我也会小写它,因为这不是 1974 年,我的编辑器使用颜色和粗体突出显示语言关键字,但我们会放手。)

硬编码模式名称是一种糟糕的做法,因为它充其量是多余的(对象在您已经使用的模式中,因此除了不必要的复杂性之外什么都不添加)或更糟的是,它限制了可移植性(如果您重命名模式或移动您的代码)必须通过它来清理硬编码的引用)。

我确信这是一个聪明的功能,意味着很好,但在这种情况下,这不是一个好建议。