Как получить предупреждение компилятора при несовпадении типов данных?
Есть ли способ принудить PL/SQL компилятор сообшить (используя подсказку компиляции или ошибку), что в коде есть попытка присваивания строчного значения в численную переменную?
В некоторых случаях неявное преобразование выполнится и присваивание будет безошибочным, но хочу избежать это присваивание вообще. Хочу всегда, чтобы было как минимум предупреждение при несовпадение типов.
Свободный перевод вопроса Oracle implicit conversion warning от участника @kovalensue
Ответы (2 шт):
Включить предупреждения компилятора для PL/SQL программ можно с помощью команды:
alter session set plsql_warnings='enable:all';
Предупреждение для неявного преобразования PLW-07204, его можно включить отдельно:
alter session set plsql_warnings='enable:7204'
/
create table tab (stringval varchar2(100))
/
SQL> create or replace procedure proc is
2 Num number;
3 Str varchar2(100);
4 begin
5 Num := 10;
6 select stringval into Str
7 from tab
8 where stringval = Num;
9 end;
10 /
SP2-0804: Procedure created with compilation warnings
SQL> show errors
Errors for PROCEDURE PROC:
LINE/COL ERROR
-------- -----------------------------------------------------------------
8/11 PLW-07204: conversion away from column type may result in
sub-optimal query plan
Это предупредит только о неявном преобразовании внутри статических SQL выражений, где оно может быть как справа, так и слева от условного оператора, и тем самым вызвать снижение производительности.
Свободный перевод ответа от участника @Andrew Sayer
Нет, это пока невозможно. Если при присвоении значения одного типа данных переменной другого типа данных применимо неявное преобразование (implicit conversion), даже если значение приведёт заведомо к ошибке этого преобразованния, то компилятор не считает это ошибкой и не предупреждает об этом.
Процитатирую Тома Кайта:
SQL and PL/SQL are very “datatype friendly”. They attempt — whenever possible — to do what you ask them to do. [...] I consider all these implicit conversions to be bugs in the developed code [...].
Это пока всё ещё актуально и поэтому, нужно отказатся от "дружественного предложения": "Мы позаботимся о преобразовании за Вас", и где это только возможно - избегать неявного преобразования.
Код ниже компилируется без ошибок и предупреждений, но в нём заложены программные ошибки, которые проявятся:
- стр. 5 - при первом запуске
- стр. 6 - года через два-три, когда DBA решит изменить десятичный разделитель с
,на.
SQL> alter session set plsql_warnings='enable:all';
SQL> create or replace procedure proc authid definer is
2 n number := 0;
3 s varchar2 (96) := '0,1';
4 begin
5 n := '123a';
6 n := s;
7 end;
8 /
Procedure created.
SQL> show errors
No errors.