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 แบบไดนามิก