Как (внезапно) выяснилось, порядок, в котором столбцы выбираются в курсор, имеет важное значение.
Пусть есть таблица:
CREATE TABLE A( F1 NUMBER(1), F2 FLOAT);
с такими данными:
INSERT INTO A VALUES(1, 11.1);
И пусть мне захотелось сделать курсор, который бы содержал данные из этой таблицы:
DECLARE
TYPE a_cursor_type IS REF CURSOR RETURN A%ROWTYPE;
a_cursor a_cursor_type;
a_record A%ROWTYPE;
BEGIN
OPEN a_cursor FOR SELECT f1, f2 FROM A;
LOOP
FETCH a_cursor INTO a_record;
EXIT WHEN a_cursor%NOTFOUND;
dbms_output.put_line('F1: ' || a_record.f1 || ', F2: ' || a_record.f2);
END LOOP;
END;
В выражении SELECT f1, f2 FROM A важно не перепутать порядок выбираемых полей таблицы - хотя в обычной жизни на такие вещи не обращаешь внимания. А вот с курсором обращать приходится, в противном случае вместо ожидаемого результата
F1: 1, F2: 11.1
F1: 2, F2: 22.22
F1: 3, F2: 33.333
легко получить
Error report:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 10
06502. 00000 - "PL/SQL: numeric or value error%s"
При этом повезёт, если типы столбцов или содержащиеся в них значения окажутся не совместимые и сразу получим сообщение об ошибке. Иначе можно совсем долго разбираться, отчего в нужных столбцах показываются неправильные данные.
Пусть есть таблица:
CREATE TABLE A( F1 NUMBER(1), F2 FLOAT);
с такими данными:
INSERT INTO A VALUES(1, 11.1);
INSERT INTO A VALUES(2, 22.22);
INSERT INTO A VALUES(3, 33.333);
И пусть мне захотелось сделать курсор, который бы содержал данные из этой таблицы:
DECLARE
TYPE a_cursor_type IS REF CURSOR RETURN A%ROWTYPE;
a_cursor a_cursor_type;
a_record A%ROWTYPE;
BEGIN
OPEN a_cursor FOR SELECT f1, f2 FROM A;
LOOP
FETCH a_cursor INTO a_record;
EXIT WHEN a_cursor%NOTFOUND;
dbms_output.put_line('F1: ' || a_record.f1 || ', F2: ' || a_record.f2);
END LOOP;
END;
В выражении SELECT f1, f2 FROM A важно не перепутать порядок выбираемых полей таблицы - хотя в обычной жизни на такие вещи не обращаешь внимания. А вот с курсором обращать приходится, в противном случае вместо ожидаемого результата
F1: 1, F2: 11.1
F1: 2, F2: 22.22
F1: 3, F2: 33.333
легко получить
Error report:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 10
06502. 00000 - "PL/SQL: numeric or value error%s"
При этом повезёт, если типы столбцов или содержащиеся в них значения окажутся не совместимые и сразу получим сообщение об ошибке. Иначе можно совсем долго разбираться, отчего в нужных столбцах показываются неправильные данные.
Комментариев нет:
Отправить комментарий