这是我的原始程序,效果很好:
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”?
关于为什么在代码已经可以工作的情况下会建议不同的格式的主题,当然有可能有格式错误的代码可以工作,所以原则上没有理由不考虑布局或重构改进,这可能会使代码更健壮、高效或更易于维护。
然而,双引号的名称是不好的做法,因为它们隐藏了命名错误并强制您指定大写/小写,结果比原来的可读性差。它们确实是一种可移植性功能,可与具有奇怪表名的第三方应用程序一起使用。代码生成器倾向于在所有内容周围加上双引号,因为这样做比检测在每种情况下是否确实需要它们更容易。没有办法
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 年,我的编辑器使用颜色和粗体突出显示语言关键字,但我们会放手。)
硬编码模式名称是一种糟糕的做法,因为它充其量是多余的(对象在您已经使用的模式中,因此除了不必要的复杂性之外什么都不添加)或更糟的是,它限制了可移植性(如果您重命名模式或移动您的代码)必须通过它来清理硬编码的引用)。
我确信这是一个聪明的功能,意味着很好,但在这种情况下,这不是一个好建议。
归档时间: |
|
查看次数: |
1367 次 |
最近记录: |