Хотя я знаю, что вы просите улучшить свой код. ИМХО лучшим подходом будет использование функции printf
, и вы можете избежать использования слишком большого количества переменных, если они есть, только если у вас нет большой программы, в которой нам может понадобиться использовать эти переменные (которые мы получаем из значений столбцов / полей) позже в программе.
awk '{printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n",\
$1,$2,$3,$4,\
$3+$(NF-1)>101?"AAA":$3+$(NF-1),\
$3+$NF>104?"BBB":$3+$NF,\
$2+100,$5,$6,$2+5000+$3)
}' Input_file
Вывод будет следующим.
3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571
РЕДАКТИРОВАТЬ: Исправлена попытка OP здесь.
Исправленное кодовое решение OP выглядит следующим образом:
awk '{
tt1 = $1
tt2 = $2
tt3 = $3
tt4 = $4
tt5 = $5
tt6 = $6
x1 = tt3 + tt5
x2 = tt3 + tt6
x3 = tt3 + tt2
x5= x3 + 5000
if(x1>101){x1="AAA"}
if(x2>104){x2="BBB"}
printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}' Input_file
Вывод будет следующим.
3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571
Исправлены проблемы в коде OP:
1 - Удалено %5d
и изменено на %d
для удаления ненужных пробелов из десяти цифр .
2 - фиксированные разделители в printf
изменили их на ,
между ними.
3- Удалена переменная x6
, кажется, она НИКОГДА не использовалась, и изменила ее на x5
.
4- изменен синтаксис условия if
. Кажется, синтаксис НЕ был правильным, поскольку он был изменен с if{.....)
на if(....)
.
5- Удален дополнительный awk
, который НЕ использовался после вышеуказанных изменений в коде.
Java ResultSet - это указатель (или курсор) на результаты в базе данных. ResultSet загружает записи в блоках из базы данных. Итак, чтобы ответить на ваш вопрос, данные извлекаются только тогда, когда вы их запрашиваете, но блоками.
Если вам нужно контролировать, сколько строк одновременно извлекает драйвер, вы можете использовать setFetchSize (int rows) в ResultSet. Это позволит вам контролировать размер блоков, которые он извлекает сразу.
В спецификации JDBC не указывается, передаются ли данные в потоковом режиме или загружаются в память. Потоки Oracle по умолчанию. MySQL этого не делает. Чтобы MySQL транслировал набор результатов, вам необходимо установить следующее в Statement:
pstmt = conn.prepareStatement(
sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
pstmt.setFetchSize(Integer.MIN_VALUE);
Хотя в спецификации JDBC не указывается, будут ли извлечены все данные в наборе результатов, ни один хорошо написанный драйвер этого не сделает.
Тем не менее, прокручиваемый набор результатов может быть больше того, что вы имеете в виду: (ссылка отредактирована, она указывает на страницу шпионского ПО)
Вы также можете рассмотреть отключенный набор строк, который хранится в сеансе (в зависимости от того, насколько масштабируемым должен быть ваш сайт): http://java.sun.com/j2se/1.4.2/docs/api/javax/sql/RowSet.html
Лучшая идея - сделать подзапрос и отображать 100 или 1000 строк за раз / на одной странице. И управление соединением с помощью пула соединений.
Чтобы сделать подзапрос, вы можете использовать количество строк в oracle и ограничение в MY SQL.