Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PerlΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 44

Автор ΠœΠΈΡ…Π°ΠΈΠ» Π¨ΠΎΡ…ΠΈΡ€Π΅Π²

Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ XBase Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с DBF-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΈΡ… индСксными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ быстрого поиска записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

Но Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π΄Π°Π²Π½ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ вмСсто спСцифичСских Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ (Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° нСльзя ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ) Π³ΠΎΡ€Π°Π·Π΄ΠΎ пСрспСктивнСС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹, основанныС Π½Π° ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ доступС ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π±Π°Π·Π΅ языка SQL.

Унификация доступа ΠΊ рСляционным Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… основана Π½Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° доступа Π½Π° нСсколько логичСских слоСв. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ слой прСдоставляСт программисту стандартный Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ источнику Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· этого источника с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запросов Π½Π° языкС SQL. Π’Ρ‚ΠΎΡ€ΠΎΠΉ слой ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° взаимодСйствиС с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΈΡ… особСнностСй. ВзаимодСйствиС с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ источником Π΄Π°Π½Π½Ρ‹Ρ… возлагаСтся Π½Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выступаСт посрСдником ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ слоСм ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° доступа ΠΈ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, скрывая ΠΎΡ‚ программиста тСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ взаимодСйствия ΠΈ спСцифичСскиС особСнности Π‘Π”. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ Π‘Π£Π‘Π” для своих ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ². На этих ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… многослойной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ основаны Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстныС ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ интСрфСйсы ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ODBC (Open DataBase Connectivity) ΠΈ JDBC (Java DataBase Connectivity).

ΠΠ½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ DBI (DataBase Interface) - основной интСрфСйс для доступа ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π² Perl. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ этого интСрфСйса являСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DBI, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ сСрвисы для взаимодСйствия с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Благодаря ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ модуля DBI программист ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² своС распоряТСниС Π΅Π΄ΠΈΠ½Ρ‹ΠΉ инструмСнт для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с самыми Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΈ Ρ‚Π΅ΠΌΠΈ, Ρ‡Ρ‚ΠΎ находятся Π½Π° этом ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΈ Ρ‚Π΅ΠΌΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΠΎΠ΄ΡƒΠ»ΡŒ DBI Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… (DataBase Driver, DBD), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: DBD::DB2, DBD::InterBase, DBD::mysql, DBD::Oracle, DBD::Sybase. Доступ ΠΊ любой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ DBI выполняСтся Π² нСсколько этапов. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌ основныС ΠΈΠ· Π½ΠΈΡ….

1Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… выполняСтся конструктором connect() класса DBI, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся строка с описаниСм источника Π΄Π°Π½Π½Ρ‹Ρ…, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π° ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

$dbh = DBI->connect($data_source, $user, $password, \%parms);


Π’ описании источника Π΄Π°Π½Π½Ρ‹Ρ… (data source) указываСтся Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ соСдинСнии c Π‘Π£Π‘Π” этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ манипулятор Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (database handler), Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² дальнСйшСм выполняСтся взаимодСйствиС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

2ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… выдСляСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ этап, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это дСйствиС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов Π‘Π£Π‘Π”. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ prepare() манипулятора Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся строка, содСрТащая ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ языка запросов SQL:

$sth = $dbh->prepare($sql_statement);


Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ SQL ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ слоты (placeholders), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ подставлСны ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ значСния Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚Π° схСма ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° подстановку Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠΎΠ»Π΅Π΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° доступна Ρ‡Π΅Ρ€Π΅Π· манипулятор ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (statement handler), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ prepare(), ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ.

3Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ нСсколькими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ выполняСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ манипулятора execute(), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ значСния для подстановки Π² выполняСмоС SQL-ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

$sth->execute(@bind_values); # Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ со списком Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ


Или ΠΆΠ΅ SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ do() манипулятора Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

$dbh->do($sql_statement); # Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π±Π΅Π· ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ


4ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· многочислСнных ΠΊΠΎΠΌΠ°Π½Π΄, прСдоставляСмых интСрфСйсом DBI.

5ΠžΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ disconnect() манипулятора Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ дСйствия ΠΈ освобоТдаСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ рСсурсы:

$dbh->disconnect; # ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π‘Π”


ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ схСма проста ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½Π°, поэтому Ρ€Π°Π±ΠΎΡ‚Π° с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· DBI быстро осваиваСтся программистами. Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ использования DBI, Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ нСсколько пояснСний.

Π’ языкС структурированных запросов SQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСбольшой Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, Π½ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия Π½Π°Π΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL: созданиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (CREATE), Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ записСй (INSERT), ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (UPDATE) ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ (DELETE), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° записСй (SELECT) ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ. Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ языка SQL Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этого курса, поэтому Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самыС простыС ΠΈΡ… Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈ смысл этих ΠΊΠΎΠΌΠ°Π½Π΄ Π±ΡƒΠ΄Π΅Ρ‚ понятСн ΠΈΠ· контСкста.

Π‘Π»ΠΎΡ‚Ρ‹ для подстановки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Π·Π½Π°ΠΊΠ°ΠΌΠΈ вопроса '?' ΠΈ выглядят Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


$sth = $dbh->prepare( 'SELECT name, area FROM mollusc WHERE id>? AND id<?');


ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 1000 ΠΈ 9000 Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ записи со значСниями ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ id Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅. ΠŸΡ€ΠΈ подстановкС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ слоты Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ:


$sth->execute(1000, 9000); # ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ числа вмСсто ?


ПослС подстановки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π°Ρ "Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ значСния столбцов name ΠΈ area ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ mollusc Ρƒ Ρ‚Π΅Ρ… записСй, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ столбца id большС 1000 ΠΈ мСньшС 9000":


SELECT name, area FROM mollusc WHERE id>1000 AND id<9000


ΠšΡ€ΠΎΠΌΠ΅ срСдств выполнСния SQL-ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ DBI прСдоставляСт мноТСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ массивов ΠΈΠ»ΠΈ Ρ…ΡΡˆΠ΅ΠΉ для Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Perl. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ с Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ, Ссли ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅


perldoc DBI


ПокаТСм ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с интСрфСйсом DBI Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класса доступа ΠΊ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ DBF-Ρ„Π°ΠΉΠ»Π°ΠΌ - модуля DBD::XBase. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ описанным Ρ€Π°Π½Π΅Π΅ способом ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ XBase. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… SQL-ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ CREATE:


use DBI; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DBI my $path = '.'; # ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ располоТСны Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π‘Π” my $table = 'mollusc'; # DBF-Ρ„Π°ΠΉΠ» # ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ Π‘Π”, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ DBD::XBase my $dbh = DBI->connect("dbi:XBase:$path") or die $DBI::errstr; # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ структуры $dbh->do("CREATE TABLE $table (id INT, name CHAR(35), latin CHAR(30), area CHAR(45))"); $dbh->disconnect; # ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π‘Π”


Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Ρ†ΠΈΠΊΠ»Π΅ заполняСт ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· тСкстового Ρ„Π°ΠΉΠ»Π°, добавляя Π² Π½Π΅Π΅ записи SQL-ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ INSERT:


use DBI; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ DBI my $path = '.'; # ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π‘Π” my $table = 'mollusc'; # DBF-Ρ„Π°ΠΉΠ» # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ Π‘Π”, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ DBD::XBase my $dbh = DBI->connect("dbi:XBase:$path") or die $DBI::errstr; # ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ выполнСния my $sth = $dbh->prepare("INSERT INTO $table (id, name, latin, area) VALUES (?, ?, ?, ?)") or die $dbh->errstr(); # Π² Ρ†ΠΈΠΊΠ»Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ строки для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Π‘Π” open my $text, '<', 'mollusc.txt' or die; # Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΊΡƒΠ΄Π° while (my $data = <$text>) { # Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, chomp($data); # удаляя \n # ΠΈ разбивая строку Π½Π° поля ΠΏΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ ';': my ($id, $name, $latin, $area) = split(';', $data); # добавляСм запись, подставляя значСния Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ $sth->execute($id, $name, $latin, $area) or die; } close $text; # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ тСстовый Ρ„Π°ΠΉΠ» $dbh->disconnect; # отсоСдиняСмся ΠΎΡ‚ Π‘Π”


Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ дСйствия с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π³Π΄Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ значСния пСрСчислСнных ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π² записи с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ удаляСтся запись ΠΏΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π½ΠΎΠΌΠ΅Ρ€Ρƒ:


use DBI; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DBI my $path = '.'; # ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ располоТСны Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π‘Π” my $table = 'mollusc'; # DBF-Ρ„Π°ΠΉΠ» # ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с Π‘Π”, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ DBD::XBase my $dbh = DBI->connect("dbi:XBase:$path") or die $DBI::errstr; # ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ запись с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, # замСняя значСния пСрСчислСнных ΠΏΠΎΠ»Π΅ΠΉ Π½Π° Π½ΠΎΠ²Ρ‹Π΅ $dbh->do("UPDATE $table SET name=?,area=? WHERE id=?", undef, 'ЖСмчуТная ΠΏΠΈΠ½ΠΊΡ‚Π°Π΄Π°', 'Австралия', 89147) or die; # ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ запись с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ 93749 $dbh->do("DELETE FROM $table WHERE id=93749") or die; $dbh->disconnect; # ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π‘Π”


Для Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ SQL-ΠΊΠΎΠΌΠ°Π½Π΄Π° SELECT, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ записи Π½ΡƒΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ ΠΎΡ‚Π±ΠΈΡ€Π°Ρ‚ΡŒ строки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:


use DBI; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DBI my $path = '.'; # ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ располоТСны Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π‘Π” my $table = 'mollusc'; # DBF-Ρ„Π°ΠΉΠ» # ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с Π‘Π”, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ DBD::XBase my $dbh = DBI->connect("dbi:XBase:$path") or die $DBI::errstr; # Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρƒ всСх строк Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля my $sth = $dbh->prepare("SELECT name,area FROM $table WHERE id>?") or die $dbh->errstr; $sth->execute(1000) or die $sth->errstr(); # Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ while (my @row = $sth->fetchrow_array) { # ΠΈ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ print "@row\n"; # Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ строки } # Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ $dbh->disconnect; # ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π‘Π”