PL/SQL - 有歧义时我可以得到警告吗
PL/SQL - Can I get warnings when there is ambiguity
我有以下代码:
create table test_table (
col_name varchar2(20) not null
);
insert into test_table values ('Value 1');
insert into test_table values ('Value 2');
insert into test_table values ('Value 3');
insert into test_table values ('Value 4');
commit;
/
declare
col_name varchar2(20) := 'Value 1';
begin
for c in (select col_name from test_table where test_table.col_name = col_name) loop
dbms_output.put_line('Row ' || c.col_name);
end loop;
commit;
end;
/
在此代码中,where
子句始终为真。显然这不是本意。是否可以让编译器警告我?
让我们运行你的例子(在 Oracle 11gR2 中)。
测试table
create table test_table (
col_name varchar2(20) not null
);
insert into test_table values ('Value 1');
insert into test_table values ('Value 2');
insert into test_table values ('Value 3');
insert into test_table values ('Value 4');
打开所有编译器警告
SQL> alter session set plsql_warnings = 'ENABLE:ALL';
测试程序
SQL> ed
Wrote file /tmp/afiedt.buf
1 create or replace procedure test_proc is
2 col_name varchar2(20) := 'Value 1';
3 begin
4 for c in (select col_name from test_table where test_table.col_name = col_name) loop
5 dbms_output.put_line('Row ' || c.col_name);
6 end loop;
7 commit;
8* end;
SQL> /
SP2-0804: Procedure created with compilation warnings
Elapsed: 00:00:00.17
SQL> show errors
Errors for PROCEDURE TEST_PROC:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit TEST_PROC omitted optional AUTHID clause;
default value DEFINER used
SQL>
结论
抱歉,编译器不会帮助您:((我们只得到了不相关的警告。)
显然您知道 PL/SQL 名称解析很好 :)
您在 PL/SQL 中可以做的最好的事情就是在 SQL 语句中完全限定所有列和 PL/SQL 变量以防止这种情况发生并明确说明您的意图。在您的代码审查中执行该政策。
我有以下代码:
create table test_table (
col_name varchar2(20) not null
);
insert into test_table values ('Value 1');
insert into test_table values ('Value 2');
insert into test_table values ('Value 3');
insert into test_table values ('Value 4');
commit;
/
declare
col_name varchar2(20) := 'Value 1';
begin
for c in (select col_name from test_table where test_table.col_name = col_name) loop
dbms_output.put_line('Row ' || c.col_name);
end loop;
commit;
end;
/
在此代码中,where
子句始终为真。显然这不是本意。是否可以让编译器警告我?
让我们运行你的例子(在 Oracle 11gR2 中)。
测试table
create table test_table (
col_name varchar2(20) not null
);
insert into test_table values ('Value 1');
insert into test_table values ('Value 2');
insert into test_table values ('Value 3');
insert into test_table values ('Value 4');
打开所有编译器警告
SQL> alter session set plsql_warnings = 'ENABLE:ALL';
测试程序
SQL> ed
Wrote file /tmp/afiedt.buf
1 create or replace procedure test_proc is
2 col_name varchar2(20) := 'Value 1';
3 begin
4 for c in (select col_name from test_table where test_table.col_name = col_name) loop
5 dbms_output.put_line('Row ' || c.col_name);
6 end loop;
7 commit;
8* end;
SQL> /
SP2-0804: Procedure created with compilation warnings
Elapsed: 00:00:00.17
SQL> show errors
Errors for PROCEDURE TEST_PROC:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit TEST_PROC omitted optional AUTHID clause;
default value DEFINER used
SQL>
结论
抱歉,编译器不会帮助您:((我们只得到了不相关的警告。)
显然您知道 PL/SQL 名称解析很好
您在 PL/SQL 中可以做的最好的事情就是在 SQL 语句中完全限定所有列和 PL/SQL 变量以防止这种情况发生并明确说明您的意图。在您的代码审查中执行该政策。