PL / SQL - 我可以在有歧义时收到警告

时间:2016-08-18 13:05:30

标签: oracle plsql oracle-sqldeveloper toad

我有以下代码:

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子句始终为true。显然这不是意图。有可能让编译器警告我吗?

1 个答案:

答案 0 :(得分:2)

让我们运行您的示例(在Oracle 11gR2中)。

测试表

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名称解析很好documented feature:)

您可以在PL / SQL中做的最好的事情是防止这种情况,并明确说明您的意图是完全限定SQL语句中的所有列和PL / SQL变量。在代码审核中实施策略。