Perl - การเข้าถึงฐานข้อมูล
บทนี้สอนวิธีเข้าถึงฐานข้อมูลภายในสคริปต์ Perl ของคุณ เริ่มจาก Perl 5 กลายเป็นเรื่องง่ายมากในการเขียนแอปพลิเคชันฐานข้อมูลโดยใช้DBIโมดูล. DBI ย่อมาจากDatabase Independent Interface สำหรับ Perl ซึ่งหมายความว่า DBI มีเลเยอร์นามธรรมระหว่างรหัส Perl และฐานข้อมูลที่อยู่เบื้องหลังช่วยให้คุณสามารถเปลี่ยนการใช้งานฐานข้อมูลได้อย่างง่ายดาย
DBI เป็นโมดูลการเข้าถึงฐานข้อมูลสำหรับภาษาโปรแกรม Perl มีชุดของวิธีการตัวแปรและรูปแบบที่จัดเตรียมอินเตอร์เฟสฐานข้อมูลที่สอดคล้องกันโดยไม่ขึ้นกับฐานข้อมูลจริงที่ใช้อยู่
สถาปัตยกรรมของ DBI Application
DBI ไม่ขึ้นอยู่กับฐานข้อมูลใด ๆ ที่มีอยู่ในแบ็กเอนด์ คุณสามารถใช้ DBI ไม่ว่าคุณจะทำงานกับ Oracle, MySQL หรือ Informix เป็นต้นซึ่งชัดเจนจากแผนภาพ architure ต่อไปนี้
DBI มีหน้าที่รับคำสั่ง SQL ทั้งหมดผ่าน API (เช่น Application Programming Interface) และส่งไปยังไดรเวอร์ที่เหมาะสมสำหรับการดำเนินการจริง และสุดท้าย DBI จะรับผิดชอบในการรับผลลัพธ์จากไดรเวอร์และส่งคืนให้กับ scritp การโทร
สัญกรณ์และอนุสัญญา
ตลอดบทนี้จะใช้สัญกรณ์ต่อไปนี้และขอแนะนำให้คุณปฏิบัติตามหลักการเดียวกันนี้ด้วย
$dsn Database source name
$dbh Database handle object
$sth Statement handle object
$h Any of the handle types above ($dbh, $sth, or $drh)
$rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer)
@ary List of values returned from the database.
$rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
การเชื่อมต่อฐานข้อมูล
สมมติว่าเรากำลังจะทำงานกับฐานข้อมูล MySQL ก่อนเชื่อมต่อกับฐานข้อมูลโปรดตรวจสอบสิ่งต่อไปนี้ คุณสามารถรับความช่วยเหลือจากบทช่วยสอน MySQL ของเราในกรณีที่คุณไม่ทราบเกี่ยวกับวิธีสร้างฐานข้อมูลและตารางในฐานข้อมูล MySQL
คุณได้สร้างฐานข้อมูลด้วยชื่อ TESTDB
คุณได้สร้างตารางที่มีชื่อ TEST_TABLE ใน TESTDB
ตารางนี้มีช่อง FIRST_NAME, LAST_NAME, AGE, SEX และรายได้
ID ผู้ใช้ "testuser" และรหัสผ่าน "test123" ถูกตั้งค่าให้เข้าถึง TESTDB
Perl Module DBI ได้รับการติดตั้งอย่างถูกต้องบนเครื่องของคุณ
คุณได้อ่านบทช่วยสอน MySQL เพื่อทำความเข้าใจเกี่ยวกับ MySQL Basics
ต่อไปนี้เป็นตัวอย่างการเชื่อมต่อกับฐานข้อมูล MySQL "TESTDB" -
#!/usr/bin/perl
use DBI
use strict;
my $driver = "mysql";
my $database = "TESTDB";
my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser";
my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
หากสร้างการเชื่อมต่อกับแหล่งข้อมูลแล้ว Database Handle จะถูกส่งคืนและบันทึกลงใน $ dbh เพื่อใช้งานต่อไปมิฉะนั้น $ dbh จะถูกตั้งค่าเป็นค่าundefและ $ DBI :: errstr จะส่งกลับสตริงข้อผิดพลาด
การทำงานของ INSERT
จำเป็นต้องมีการดำเนินการ INSERT เมื่อคุณต้องการสร้างระเบียนลงในตาราง ที่นี่เรากำลังใช้ตาราง TEST_TABLE เพื่อสร้างบันทึกของเรา เมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วเราก็พร้อมที่จะสร้างบันทึกลงใน TEST_TABLE ต่อไปนี้เป็นขั้นตอนในการสร้างเรกคอร์ดเดี่ยวใน TEST_TABLE คุณสามารถสร้างระเบียนได้มากเท่าที่คุณต้องการโดยใช้แนวคิดเดียวกัน
การสร้างเรกคอร์ดทำตามขั้นตอนต่อไปนี้ -
การเตรียมคำสั่ง SQL ด้วยคำสั่ง INSERT ซึ่งจะทำได้โดยใช้prepare() API
ดำเนินการสอบถาม SQL เพื่อเลือกผลลัพธ์ทั้งหมดจากฐานข้อมูล ซึ่งจะทำได้โดยใช้execute() API
การปลดแฮนเดิล Stattement ซึ่งจะทำได้โดยใช้finish() API
ถ้าทุกอย่างเป็นไปด้วยดี commit การดำเนินการนี้คุณสามารถทำได้ rollbackการทำธุรกรรมที่สมบูรณ์ คำมั่นสัญญาและการย้อนกลับจะอธิบายไว้ในส่วนถัดไป
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
การใช้ Bind Values
อาจมีบางกรณีที่ไม่ได้ให้ค่าที่จะป้อนล่วงหน้า ดังนั้นคุณสามารถใช้ตัวแปรการผูกซึ่งจะรับค่าที่ต้องการในขณะทำงาน โมดูล Perl DBI ใช้เครื่องหมายคำถามแทนค่าจริงจากนั้นค่าจริงจะถูกส่งผ่าน execute () API ในขณะรัน ต่อไปนี้เป็นตัวอย่าง -
my $first_name = "john";
my $last_name = "poul";
my $sex = "M";
my $income = 13000;
my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
(?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income)
or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
อ่านการทำงาน
การดำเนินการอ่านบนฐานข้อมูลใด ๆ หมายถึงการดึงข้อมูลที่เป็นประโยชน์บางอย่างจากฐานข้อมูลนั่นคือบันทึกตั้งแต่หนึ่งตารางขึ้นไป ดังนั้นเมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วเราก็พร้อมที่จะทำการสืบค้นในฐานข้อมูลนี้ ต่อไปนี้เป็นขั้นตอนในการสืบค้นระเบียนทั้งหมดที่มี AGE มากกว่า 20 ซึ่งจะใช้สี่ขั้นตอน -
การเตรียมแบบสอบถาม SQL SELECT ตามเงื่อนไขที่จำเป็น ซึ่งจะทำได้โดยใช้prepare() API
ดำเนินการสอบถาม SQL เพื่อเลือกผลลัพธ์ทั้งหมดจากฐานข้อมูล ซึ่งจะทำได้โดยใช้execute() API
ดึงผลลัพธ์ทั้งหมดทีละรายการและพิมพ์ผลลัพธ์เหล่านั้นสิ่งนี้จะทำได้โดยใช้ fetchrow_array() API
การปลดแฮนเดิล Stattement ซึ่งจะทำได้โดยใช้finish() API
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
การใช้ Bind Values
อาจมีกรณีที่ไม่ได้รับเงื่อนไขล่วงหน้า ดังนั้นคุณสามารถใช้ตัวแปรการผูกซึ่งจะรับค่าที่ต้องการในขณะรัน โมดูล Perl DBI ใช้เครื่องหมายคำถามแทนค่าจริงจากนั้นค่าจริงจะถูกส่งผ่าน execute () API ในขณะรัน ต่อไปนี้เป็นตัวอย่าง -
$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr;
print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
อัปเดตการทำงาน
UPDATE การดำเนินการบนฐานข้อมูลหมายถึงการอัปเดตหนึ่งระเบียนหรือมากกว่าที่มีอยู่แล้วในตารางฐานข้อมูล ต่อไปนี้เป็นขั้นตอนในการอัปเดตระเบียนทั้งหมดที่มี SEX เป็น 'M' ที่นี่เราจะเพิ่มอายุของผู้ชายทุกคนขึ้นหนึ่งปี ขั้นตอนนี้จะใช้สามขั้นตอน -
การเตรียมแบบสอบถาม SQL ตามเงื่อนไขที่จำเป็น ซึ่งจะทำได้โดยใช้prepare() API
ดำเนินการสอบถาม SQL เพื่อเลือกผลลัพธ์ทั้งหมดจากฐานข้อมูล ซึ่งจะทำได้โดยใช้execute() API
การปลดแฮนเดิล Stattement ซึ่งจะทำได้โดยใช้finish() API
ถ้าทุกอย่างเป็นไปด้วยดี commit การดำเนินการนี้คุณสามารถทำได้ rollbackการทำธุรกรรมที่สมบูรณ์ ดูหัวข้อถัดไปสำหรับการกระทำและการย้อนกลับ API
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
การใช้ Bind Values
อาจมีกรณีที่ไม่ได้รับเงื่อนไขล่วงหน้า ดังนั้นคุณสามารถใช้ตัวแปรการผูกซึ่งจะรับค่าที่ต้องการในขณะรัน โมดูล Perl DBI ใช้เครื่องหมายคำถามแทนค่าจริงจากนั้นค่าจริงจะถูกส่งผ่าน execute () API ในขณะรัน ต่อไปนี้เป็นตัวอย่าง -
$sex = 'M';
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = ?");
$sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
ในบางกรณีคุณต้องการตั้งค่าซึ่งไม่ได้กำหนดไว้ล่วงหน้าคุณจึงสามารถใช้ค่าการผูกได้ดังนี้ ในตัวอย่างนี้รายได้ของผู้ชายทั้งหมดจะถูกกำหนดไว้ที่ 10,000
$sex = 'M';
$income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET INCOME = ?
WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
ลบการดำเนินการ
จำเป็นต้องดำเนินการ DELETE เมื่อคุณต้องการลบบางระเบียนออกจากฐานข้อมูลของคุณ ต่อไปนี้เป็นขั้นตอนในการลบระเบียนทั้งหมดจาก TEST_TABLE โดยที่ AGE เท่ากับ 30 การดำเนินการนี้จะดำเนินการตามขั้นตอนต่อไปนี้
การเตรียมแบบสอบถาม SQL ตามเงื่อนไขที่จำเป็น ซึ่งจะทำได้โดยใช้prepare() API
การดำเนินการแบบสอบถาม SQL เพื่อลบบันทึกที่ต้องการออกจากฐานข้อมูล ซึ่งจะทำได้โดยใช้execute() API
การปลดแฮนเดิล Stattement ซึ่งจะทำได้โดยใช้finish() API
ถ้าทุกอย่างเป็นไปด้วยดี commit การดำเนินการนี้คุณสามารถทำได้ rollback การทำธุรกรรมที่สมบูรณ์
$age = 30;
my $sth = $dbh->prepare("DELETE FROM TEST_TABLE
WHERE AGE = ?");
$sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
ใช้ do Statement
หากคุณกำลังทำการอัปเดตแทรกหรือลบจะไม่มีข้อมูลที่กลับมาจากฐานข้อมูลดังนั้นจึงมีทางลัดเพื่อดำเนินการนี้ คุณสามารถใช้ได้do คำสั่งเพื่อดำเนินการคำสั่งใด ๆ ดังต่อไปนี้
$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');
doส่งคืนค่าจริงหากสำเร็จและเป็นค่าเท็จหากล้มเหลว อันที่จริงถ้ามันสำเร็จจะส่งกลับจำนวนแถวที่ได้รับผลกระทบ ในตัวอย่างจะส่งคืนจำนวนแถวที่ถูกลบจริง
COMMIT การดำเนินการ
Commit คือการดำเนินการที่ให้สัญญาณสีเขียวไปยังฐานข้อมูลเพื่อทำการเปลี่ยนแปลงให้เสร็จสิ้นและหลังจากการดำเนินการนี้จะไม่มีการเปลี่ยนกลับไปที่ตำแหน่งเดิม
นี่คือตัวอย่างง่ายๆในการโทร commit API
$dbh->commit or die $dbh->errstr;
การทำงานของ ROLLBACK
หากคุณไม่พอใจกับการเปลี่ยนแปลงทั้งหมดหรือพบข้อผิดพลาดระหว่างการดำเนินการใด ๆ คุณสามารถยกเลิกการเปลี่ยนแปลงเหล่านั้นเพื่อใช้ rollback API
นี่คือตัวอย่างง่ายๆในการโทร rollback API
$dbh->rollback or die $dbh->errstr;
เริ่มการทำธุรกรรม
ฐานข้อมูลจำนวนมากรองรับธุรกรรม ซึ่งหมายความว่าคุณสามารถสร้างแบบสอบถามทั้งหมดซึ่งจะแก้ไขฐานข้อมูล แต่จะไม่มีการเปลี่ยนแปลงใด ๆ จากนั้นในตอนท้ายคุณออกแบบสอบถาม SQL พิเศษCOMMITและทำการเปลี่ยนแปลงทั้งหมดพร้อมกัน หรือคุณสามารถเรียกใช้การสืบค้น ROLLBACK ซึ่งในกรณีนี้การเปลี่ยนแปลงทั้งหมดจะถูกโยนทิ้งไปและฐานข้อมูลจะไม่เปลี่ยนแปลง
มีโมดูล Perl DBI begin_workAPI ซึ่งเปิดใช้งานธุรกรรม (โดยการปิด AutoCommit) จนกว่าจะมีการเรียกครั้งถัดไปเพื่อกระทำหรือย้อนกลับ หลังจากการคอมมิตหรือการย้อนกลับครั้งถัดไป AutoCommit จะเปิดอีกครั้งโดยอัตโนมัติ
$rc = $dbh->begin_work or die $dbh->errstr;
ตัวเลือก AutoCommit
หากการทำธุรกรรมของคุณเรียบง่ายคุณสามารถช่วยตัวเองไม่ให้ต้องเสียค่าคอมมิชชั่นจำนวนมาก เมื่อคุณทำการโทรเชื่อมต่อคุณสามารถระบุไฟล์AutoCommitตัวเลือกซึ่งจะดำเนินการคอมมิตอัตโนมัติหลังจากการสืบค้นสำเร็จทุกครั้ง นี่คือสิ่งที่ดูเหมือน -
my $dbh = DBI->connect($dsn, $userid, $password,
{AutoCommit => 1})
or die $DBI::errstr;
ที่นี่ AutoCommit สามารถรับค่า 1 หรือ 0 โดยที่ 1 หมายถึง AutoCommit เปิดอยู่และ 0 หมายถึง AutoCommit ปิดอยู่
การจัดการข้อผิดพลาดอัตโนมัติ
เมื่อคุณทำการโทรเชื่อมต่อคุณสามารถระบุตัวเลือก RaiseErrors ที่จัดการข้อผิดพลาดให้คุณโดยอัตโนมัติ เมื่อเกิดข้อผิดพลาด DBI จะยกเลิกโปรแกรมของคุณแทนที่จะส่งคืนรหัสความล้มเหลว หากสิ่งที่คุณต้องการคือการยกเลิกโปรแกรมเมื่อเกิดข้อผิดพลาดสิ่งนี้สามารถทำได้สะดวก นี่คือสิ่งที่ดูเหมือน -
my $dbh = DBI->connect($dsn, $userid, $password,
{RaiseError => 1})
or die $DBI::errstr;
ที่นี่ RaiseError สามารถรับค่า 1 หรือ 0
กำลังยกเลิกการเชื่อมต่อฐานข้อมูล
ในการยกเลิกการเชื่อมต่อฐานข้อมูลให้ใช้ disconnect API ดังนี้ -
$rc = $dbh->disconnect or warn $dbh->errstr;
พฤติกรรมการทำธุรกรรมของวิธีการตัดการเชื่อมต่อนั้นน่าเศร้าที่ไม่ได้กำหนดไว้ ระบบฐานข้อมูลบางระบบ (เช่น Oracle และ Ingres) จะทำการเปลี่ยนแปลงที่ค้างอยู่โดยอัตโนมัติ แต่ระบบอื่น ๆ (เช่น Informix) จะย้อนกลับการเปลี่ยนแปลงที่ค้างอยู่ แอปพลิเคชันที่ไม่ได้ใช้ AutoCommit ควรเรียกคอมมิตหรือย้อนกลับอย่างชัดเจนก่อนที่จะโทรยกเลิกการเชื่อมต่อ
การใช้ค่า NULL
ค่าที่ไม่ได้กำหนดหรือ undef ใช้เพื่อระบุค่า NULL คุณสามารถแทรกและอัปเดตคอลัมน์ด้วยค่า NULL ได้เช่นเดียวกับค่าที่ไม่ใช่ค่า NULL ตัวอย่างเหล่านี้แทรกและอัปเดตอายุคอลัมน์ด้วยค่า NULL -
$sth = $dbh->prepare(qq {
INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?)
});
$sth->execute("Joe", undef);
ที่นี่ qq{} ใช้เพื่อส่งคืนสตริงที่ยกมาให้ prepareAPI อย่างไรก็ตามต้องใช้ความระมัดระวังเมื่อพยายามใช้ค่า NULL ในส่วนคำสั่ง WHERE พิจารณา -
SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?
การผูก undef (NULL) กับตัวยึดจะไม่เลือกแถวที่มีอายุเป็นโมฆะ! อย่างน้อยสำหรับเอ็นจิ้นฐานข้อมูลที่เป็นไปตามมาตรฐาน SQL อ้างถึงคู่มือ SQL สำหรับเครื่องมือฐานข้อมูลของคุณหรือหนังสือ SQL สำหรับสาเหตุนี้ หากต้องการเลือก NULL อย่างชัดเจนคุณต้องพูดว่า "WHERE age IS NULL"
ปัญหาทั่วไปคือการมีโค้ดแฟรกเมนต์จัดการกับค่าที่สามารถกำหนดหรือ undef (ไม่ใช่ NULL หรือ NULL) ในขณะรันไทม์ เทคนิคง่ายๆคือการเตรียมคำสั่งที่เหมาะสมตามความจำเป็นและแทนที่ตัวยึดตำแหน่งสำหรับกรณีที่ไม่เป็นโมฆะ -
$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause
});
$sth->execute(defined $age ? $age : ());
ฟังก์ชั่น DBI อื่น ๆ
available_drivers
@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);
ส่งคืนรายการไดรเวอร์ที่มีทั้งหมดโดยค้นหาโมดูล DBD :: * ผ่านไดเร็กทอรีใน @INC โดยค่าเริ่มต้นคำเตือนจะได้รับหากไดรเวอร์บางตัวถูกซ่อนโดยผู้อื่นที่มีชื่อเดียวกันในไดเรกทอรีก่อนหน้านี้ การส่งผ่านมูลค่าที่แท้จริงสำหรับ $ quiet จะยับยั้งคำเตือน
installed_drivers
%drivers = DBI->installed_drivers();
ส่งคืนรายการชื่อไดรเวอร์และคู่จับคู่ไดรเวอร์สำหรับไดรเวอร์ทั้งหมดที่ 'ติดตั้ง' (โหลดแล้ว) ในกระบวนการปัจจุบัน ชื่อไดรเวอร์ไม่มีคำนำหน้า "DBD ::"
แหล่งข้อมูล
@ary = DBI->data_sources($driver);
ส่งคืนรายการแหล่งข้อมูล (ฐานข้อมูล) ที่พร้อมใช้งานผ่านไดรเวอร์ที่ระบุชื่อ ถ้า $ driver ว่างเปล่าหรือ undef จะใช้ค่าของตัวแปรสภาวะแวดล้อม DBI_DRIVER
อ้าง
$sql = $dbh->quote($value);
$sql = $dbh->quote($value, $data_type);
อ้างสตริงลิเทอรัลเพื่อใช้เป็นค่าลิเทอรัลในคำสั่ง SQL โดยการใช้อักขระพิเศษ (เช่นเครื่องหมายอัญประกาศ) ที่อยู่ภายในสตริงและเพิ่มประเภทของเครื่องหมายคำพูดภายนอกที่ต้องการ
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
สำหรับประเภทฐานข้อมูลส่วนใหญ่ quote จะส่งกลับ 'Don''t' (รวมถึงเครื่องหมายอัญประกาศด้านนอก) ใช้ได้กับวิธี quote () เพื่อส่งคืนนิพจน์ SQL ที่ประเมินเป็นสตริงที่ต้องการ ตัวอย่างเช่น -
$quoted = $dbh->quote("one\ntwo\0three")
may produce results which will be equivalent to
CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
วิธีการทั่วไปสำหรับทุกแฮนเดิล
ผิดพลาด
$rv = $h->err;
or
$rv = $DBI::err
or
$rv = $h->err
ส่งคืนรหัสข้อผิดพลาดเอ็นจินฐานข้อมูลเนทีฟจากเมธอดไดรเวอร์ล่าสุดที่เรียก โดยทั่วไปรหัสจะเป็นจำนวนเต็ม แต่คุณไม่ควรคิดเช่นนั้น สิ่งนี้เทียบเท่ากับ $ DBI :: err หรือ $ h-> err
errstr
$str = $h->errstr;
or
$str = $DBI::errstr
or
$str = $h->errstr
ส่งคืนข้อความแสดงข้อผิดพลาดเอ็นจินฐานข้อมูลเนทีฟจากเมธอด DBI ล่าสุดที่เรียก ซึ่งมีปัญหาด้านอายุการใช้งานเช่นเดียวกับวิธีการ "err" ที่อธิบายไว้ข้างต้น สิ่งนี้เทียบเท่ากับ $ DBI :: errstr หรือ $ h-> errstr
แถว
$rv = $h->rows;
or
$rv = $DBI::rows
ส่งคืนจำนวนแถวที่ได้รับผลจากคำสั่ง SQL ก่อนหน้าและเทียบเท่ากับ $ DBI :: แถว
ติดตาม
$h->trace($trace_settings);
DBI มีความสามารถที่มีประโยชน์อย่างยิ่งในการสร้างข้อมูลการติดตามรันไทม์ของสิ่งที่กำลังทำอยู่ซึ่งอาจช่วยประหยัดเวลาได้มากเมื่อพยายามติดตามปัญหาแปลก ๆ ในโปรแกรม DBI ของคุณ คุณสามารถใช้ค่าต่างๆเพื่อตั้งค่าระดับการติดตาม ค่าเหล่านี้แตกต่างกันไปตั้งแต่ 0 ถึง 4 ค่า 0 หมายถึงปิดใช้งานการติดตามและ 4 หมายถึงสร้างการติดตามที่สมบูรณ์
คำสั่ง Interpolated ถูกห้าม
ขอแนะนำอย่างยิ่งว่าอย่าใช้คำสั่งสอดแทรกดังนี้ -
while ($first_name = <>) {
my $sth = $dbh->prepare("SELECT *
FROM TEST_TABLE
WHERE FIRST_NAME = '$first_name'");
$sth->execute();
# and so on ...
}
ดังนั้นอย่าใช้คำสั่ง interpolated แทนใช้ bind value เพื่อเตรียมคำสั่ง SQL แบบไดนามิก