Kiểu dữ liệu vô hướng là gì?

Mỗi phần tử hằng và biến bạn sử dụng trong chương trình của mình đều có một kiểu dữ liệu. Kiểu dữ liệu quy định định dạng lưu trữ, các hạn chế về cách sử dụng biến và các giá trị hợp lệ có thể được đặt trong biến đó

PL/SQL cung cấp một tập hợp toàn diện các kiểu dữ liệu hỗn hợp và vô hướng được xác định trước. Một kiểu dữ liệu vô hướng là một nguyên tử; . Một kiểu dữ liệu tổng hợp có cấu trúc bên trong hoặc các thành phần. Hai loại kết hợp hiện được PL/SQL hỗ trợ là bản ghi và bảng [được mô tả lần lượt trong Chương 9, Bản ghi trong PL/SQL và Chương 10, Bảng PL/SQL]

Các kiểu dữ liệu vô hướng rơi vào một trong bốn loại hoặc họ. số, ký tự, Boolean và ngày giờ, như được hiển thị trong


Bảng 4. 1. Danh mục kiểu dữ liệu

Loại

Loại dữ liệu

Con số

BINARY_INTEGER

THÁNG MƯỜI HAI

SỐ THẬP PHÂN

CHÍNH XÁC NHÂN ĐÔI

TRÔI NỔI

INT

số nguyên

TỰ NHIÊN

CON SỐ

SỐ

PLS_INTEGER

TÍCH CỰC

THỰC

NHỎ

Nhân vật

CHAR

NHÂN VẬT

DÀI

NGUYÊN DÀI

NCHAR

NVARCHAR2

NGUYÊN

ROWID

CHUỖI

VARCHAR

VARCHAR2

Boolean

BOOLESE

Ngày giờ

NGÀY THÁNG

Đối tượng lớn [LOB]

BFILE

BÃI

CLOB

NCLOB

Chúng ta hãy xem xét kỹ hơn từng kiểu dữ liệu vô hướng

PL/SQL, giống như Oracle RDBMS, cung cấp nhiều kiểu dữ liệu số để phù hợp với các mục đích khác nhau. Thông thường có hai loại dữ liệu số. số nguyên và số thập phân [trong đó cho phép các chữ số ở bên phải dấu thập phân]

4. 2. 1. 1 Kiểu dữ liệu số nguyên nhị phân

Toàn bộ số, hoặc số nguyên, kiểu dữ liệu là

BINARY_INTEGERINTEGERSMALLINTPOSITIVENATURAL

Kiểu dữ liệu BINARY_INTEGER cho phép bạn lưu trữ các số nguyên đã ký. Phạm vi độ lớn của BINARY_INTEGER là -2 31 + 1 đến 2 31 - 1 [2 31 bằng 2147483647]. BINARY_INTEGERs được biểu diễn trong trình biên dịch PL/SQL dưới dạng số nhị phân có dấu. Do đó, chúng không cần phải được chuyển đổi trước khi PL/SQL thực hiện các phép tính số. Tuy nhiên, các biến kiểu NUMBER [xem "] cần phải được chuyển đổi. Vì vậy, nếu bạn sẽ thực hiện các phép tính chuyên sâu với các giá trị số nguyên, thì bạn có thể thấy hiệu suất được cải thiện bằng cách khai báo các biến của mình là BINARY_INTEGER. Thành thật mà nói, trong hầu hết các trường hợp, khoản tiết kiệm nhỏ do BINARY_INTEGER mang lại sẽ không đáng chú ý

TỰ NHIÊN và TÍCH CỰC đều là các kiểu con của BINARY_INTEGER. Một kiểu con sử dụng định dạng lưu trữ và các hạn chế về cách sử dụng biến của kiểu này, nhưng nó chỉ cho phép một tập hợp con các giá trị hợp lệ mà kiểu dữ liệu đầy đủ cho phép. Trong trường hợp các kiểu con BINARY_INTEGER, chúng tôi có các tập hợp con giá trị sau

TỰ NHIÊN

0 đến 231

TÍCH CỰC

1 đến 2 31

Nếu bạn có một biến mà các giá trị của nó phải luôn không âm [0 hoặc lớn hơn], bạn nên khai báo biến đó là TỰ NHIÊN hoặc TÍCH CỰC. Điều này cải thiện khía cạnh tự ghi lại mã của bạn

4. 2. 1. 2 Kiểu dữ liệu số thập phân

Các kiểu dữ liệu số thập phân là

NUMBERFLOATDECDECIMALDOUBLE CHÍNH XÁCNUMBERNUMERICREAL

Sử dụng kiểu dữ liệu NUMBER để lưu trữ các số có dấu phẩy động hoặc cố định với kích thước bất kỳ. Độ chính xác tối đa của biến có kiểu NUMBER là 38 chữ số. Điều này có nghĩa là phạm vi độ lớn của các giá trị là 1. 0E-129 đến 9. 999E125;

Khi bạn khai báo một loại biến SỐ, bạn cũng có thể tùy chọn chỉ định độ chính xác và tỷ lệ của biến, như sau

NUMBER [precision, scale]

Độ chính xác của SỐ là tổng số chữ số. Tỷ lệ quy định số chữ số ở bên phải hoặc bên trái của dấu thập phân mà tại đó làm tròn xảy ra. Cả giá trị độ chính xác và tỷ lệ phải là giá trị bằng chữ [và số nguyên ở đó]; . Các giá trị pháp lý cho phạm vi thang đo từ -84 đến 127. Làm tròn hoạt động như sau

  • Nếu thang đo là dương, thì thang đo xác định điểm tại đó việc làm tròn xảy ra ở bên phải dấu thập phân

  • Nếu tỷ lệ âm, thì tỷ lệ xác định điểm tại đó làm tròn xảy ra ở bên trái của dấu thập phân

  • Nếu thang đo bằng 0 thì làm tròn đến số nguyên gần nhất

  • Nếu tỷ lệ không được chỉ định, thì không xảy ra làm tròn

Các ví dụ sau minh họa các cách khác nhau mà bạn có thể khai báo biến kiểu NUMBER

  • Biến bean_counter có thể chứa các giá trị có độ chính xác lên đến mười chữ số, ba trong số đó nằm ở bên phải dấu thập phân. Nếu bạn chỉ định 12345. 6784 thành bean_counter, nó được làm tròn thành 12345. 678. Nếu bạn chỉ định 1234567891. 23 vào biến, thao tác sẽ trả về lỗi vì có nhiều chữ số hơn mức cho phép về độ chính xác

    bean_counter NUMBER [10,3];
  • Biến big_whole_number chứa các số nguyên bao trùm toàn bộ phạm vi giá trị được hỗ trợ, vì độ chính xác mặc định là 38 và tỷ lệ mặc định là 0

    big_whole_number NUMBER;
  • Biến round_million được khai báo với tỷ lệ âm. Điều này gây ra làm tròn sang bên trái của dấu thập phân. Giống như thang -1 sẽ làm tròn đến hàng phần mười gần nhất, thang -2 sẽ làm tròn đến hàng trăm gần nhất và thang -6 sẽ làm tròn đến hàng triệu gần nhất. Nếu bạn chỉ định 53. 35 thành round_million, nó sẽ được làm tròn thành 0. Nếu bạn chỉ định 1.567.899 cho round_million, nó sẽ được làm tròn thành hai triệu [2.000.000]

    rounded_million NUMBER [10,-6];
  • Trong tuyên bố bất thường nhưng hoàn toàn hợp lệ sau đây, thang đo lớn hơn độ chính xác. Trong trường hợp này, độ chính xác cho biết số chữ số tối đa được phép -- tất cả ở bên phải dấu thập phân. Nếu bạn chỉ định. 003566 thành small_value, nó sẽ được làm tròn thành. 00357. Vì tỷ lệ lớn hơn hai lần so với độ chính xác, bất kỳ giá trị nào được gán cho small_value phải có hai số 0 ngay bên phải dấu thập phân, theo sau là tối đa ba chữ số khác không

    small_value NUMBER [3, 5];

4. 2. 1. 3 Kiểu dữ liệu PLS_INTEGER

Kiểu dữ liệu này có sẵn trong PL/SQL Release 2. 3 trở lên

Các biến được khai báo là PLS_INTEGER lưu trữ các số nguyên đã ký. Phạm vi cường độ cho kiểu dữ liệu này là -2147483647 đến 2147483647. Oracle khuyên bạn nên sử dụng PLS_INTEGER cho tất cả các phép tính số nguyên không nằm ngoài phạm vi của nó. Các giá trị PLS_INTEGER yêu cầu ít bộ nhớ hơn NUMBER giá trị và các thao tác trên PLS_INTEGER sử dụng số học máy, làm cho chúng hiệu quả hơn

Các biến được khai báo là pls_integer và binary_integer có cùng phạm vi, nhưng chúng được xử lý khác nhau. Khi một phép tính liên quan đến tràn pls_integer, pl/sql sẽ đưa ra một ngoại lệ. Tuy nhiên, lỗi tràn tương tự liên quan đến số nguyên nhị phân sẽ không đưa ra ngoại lệ nếu kết quả được gán cho một biến số

Phần còn lại của các kiểu dữ liệu trong danh mục số đều là các kiểu con của NUMBER. Chúng được cung cấp trong Oracle's SQL và PL/SQL để cung cấp khả năng tương thích với các kiểu dữ liệu ANSI SQL, SQL/DS và DB2. Chúng có cùng phạm vi giá trị pháp lý như loại cơ sở của chúng, như được hiển thị trong. Các kiểu dữ liệu NUMERIC, DECIMAL và DEC chỉ có thể khai báo các số có điểm cố định. FLOAT, DOUBLE PRECISION và REAL cho phép dấu thập phân động với độ chính xác nhị phân nằm trong khoảng từ 63 đến 126


Bảng 4. 2. Các kiểu con số được xác định trước

tiểu loại

khả năng tương thích

Kiểu dữ liệu Oracle tương ứng

DEC [prec, tỷ lệ]

ANSI

SỐ [prec, tỷ lệ]

DECIMAL [prec, tỷ lệ]

IBM

SỐ [prec, tỷ lệ]

CHÍNH XÁC NHÂN ĐÔI

ANSI

CON SỐ

FLOAT [nhị phân]

ANSI, IBM

CON SỐ

INT

ANSI

SỐ [38]

số nguyên

ANSI, IBM

SỐ [38]

NUMERIC [prec, tỷ lệ]

ANSI

SỐ [prec, tỷ lệ]

THỰC

ANSI

CON SỐ

NHỎ

ANSI, IBM

SỐ [38]

Prec, scale và binary có các ý nghĩa sau

chuẩn bị

Độ chính xác cho loại phụ

tỉ lệ

Quy mô của tiểu loại

nhị phân

Độ chính xác nhị phân của kiểu con

Các biến có kiểu dữ liệu ký tự lưu trữ văn bản và được thao tác bởi các hàm ký tự. Bởi vì các chuỗi ký tự là "dạng tự do" nên có một số quy tắc liên quan đến nội dung của chúng. Ví dụ, bạn có thể lưu số và chữ cái, cũng như bất kỳ sự kết hợp nào của các ký tự đặc biệt, trong một biến kiểu ký tự. Tuy nhiên, có một số loại kiểu dữ liệu ký tự khác nhau, mỗi loại phục vụ một mục đích cụ thể.

4. 2. 3. 1 Kiểu dữ liệu CHAR

Kiểu dữ liệu CHAR chỉ định rằng chuỗi ký tự có độ dài cố định. Khi bạn khai báo một chuỗi có độ dài cố định, bạn cũng chỉ định độ dài tối đa cho chuỗi, có thể nằm trong khoảng từ 1 đến 32767 byte [giá trị này cao hơn nhiều so với kiểu dữ liệu CHAR trong Oracle RDBMS, chỉ có 255]. Nếu bạn không chỉ định độ dài cho chuỗi, thì PL/SQL sẽ khai báo chuỗi một byte. Lưu ý rằng điều này ngược lại với tình huống với kiểu dữ liệu SỐ. Ví dụ, một tuyên bố của

fit_almost_anything NUMBER;

dẫn đến một biến số có độ chính xác lên tới 38 chữ số. Bạn có thể dễ dàng có thói quen xấu là khai báo tất cả các biến số nguyên đơn giản là SỐ, ngay cả khi phạm vi của các giá trị pháp lý nhỏ hơn nhiều so với giá trị mặc định. Tuy nhiên, nếu bạn thử một chiến thuật tương tự với CHAR, bạn có thể gặp bất ngờ khó chịu. Nếu bạn khai báo một biến như sau

line_of_text CHAR;

sau đó ngay khi bạn gán một chuỗi nhiều hơn một ký tự cho line_of_text, PL/SQL sẽ đưa ra ngoại lệ VALUE_ERROR chung. Nó sẽ không cho bạn biết nơi nó gặp phải vấn đề này. Vì vậy, nếu bạn gặp phải lỗi này, hãy kiểm tra các khai báo biến của bạn để biết việc sử dụng CHAR lười biếng

Để chắc chắn, bạn phải luôn chỉ định độ dài khi sử dụng kiểu dữ liệu CHAR. Một số ví dụ sau

yes_or_no CHAR [1] DEFAULT 'Y';
line_of_text    CHAR [80]; --Always a full 80 characters!
whole_paragraph CHAR [10000]; --Think of all the spaces...

Hãy nhớ rằng mặc dù bạn có thể khai báo một biến CHAR với 10.000 ký tự, nhưng bạn sẽ không thể nhồi giá trị của biến PL/SQL đó vào một cột cơ sở dữ liệu kiểu CHAR. Nó sẽ mất tối đa 255 ký tự. Vì vậy, nếu bạn muốn chèn một giá trị CHAR vào cơ sở dữ liệu và độ dài được khai báo của nó lớn hơn 255, bạn sẽ phải sử dụng hàm SUBSTR [được mô tả trong Chương 11, Hàm Ký tự ] để cắt bớt giá trị theo kích thước

________số 8

Bởi vì CHAR có độ dài cố định, PL/SQL sẽ đệm bên phải bất kỳ giá trị nào được gán cho biến CHAR với khoảng trắng theo độ dài tối đa được chỉ định trong khai báo. Trước Oracle7, kiểu dữ liệu CHAR có độ dài thay đổi; . Để cải thiện khả năng tương thích với cơ sở dữ liệu quan hệ của IBM và tuân thủ các tiêu chuẩn ANSI, Oracle7 đã giới thiệu lại CHAR dưới dạng kiểu dữ liệu có độ dài cố định và cung cấp VARCHAR2 dưới dạng kiểu dữ liệu có độ dài thay đổi. Khi RDBMS Phiên bản 6 được nâng cấp lên Oracle7, tất cả các cột CHAR sẽ tự động được chuyển đổi thành VARCHAR2. [VARCHAR2 được thảo luận trong phần tiếp theo. ]

Bạn sẽ hiếm khi cần hoặc muốn sử dụng kiểu dữ liệu CHAR trong các ứng dụng dựa trên Oracle. Trên thực tế, tôi khuyên bạn không bao giờ nên sử dụng CHAR trừ khi có yêu cầu cụ thể đối với các chuỗi có độ dài cố định hoặc trừ khi bạn đang làm việc với các nguồn dữ liệu như DB2. Dữ liệu ký tự trong DB2 hầu như luôn được lưu trữ ở định dạng có độ dài cố định do các vấn đề về hiệu suất liên quan đến lưu trữ có độ dài thay đổi. Vì vậy, nếu bạn xây dựng các ứng dụng dựa trên DB2, bạn có thể phải tính đến dữ liệu có độ dài cố định trong các câu lệnh SQL và trong mã thủ tục của mình. Ví dụ: bạn có thể cần sử dụng RTRIM để xóa dấu cách khỏi [hoặc RPAD để đệm dấu cách vào] nhiều biến của bạn để cho phép so sánh chuỗi hoạt động bình thường. [Các chức năng ký tự này được mô tả trong Chương 11. ]

4. 2. 3. 2 Kiểu dữ liệu VARCHAR2 và VARCHAR

Biến VARCHAR2 lưu trữ các chuỗi ký tự có độ dài thay đổi. Khi bạn khai báo một chuỗi có độ dài thay đổi, bạn cũng phải chỉ định độ dài tối đa cho chuỗi, có thể nằm trong khoảng từ 1 đến 32767 byte. Định dạng chung cho khai báo VARCHAR2 là

 VARCHAR2 [];

như trong

bean_counter NUMBER [10,3];
0

GHI CHÚ. Trong phiên bản 1. 1 của PL/SQL mà bạn sử dụng trong các công cụ Oracle Developer/2000 như Oracle Forms, trình biên dịch không yêu cầu bạn đưa vào độ dài tối đa cho khai báo VARCHAR2. Do đó, bạn có thể bỏ nhầm độ dài trong phần khai báo và kết thúc bằng một biến có độ dài tối đa là một ký tự. Như đã thảo luận trong phần về kiểu dữ liệu CHAR có độ dài cố định, điều này có thể khiến PL/SQL tăng ngoại lệ VALUE_ERROR thời gian chạy. Luôn bao gồm độ dài tối đa trong khai báo biến ký tự của bạn

Độ dài tối đa được phép cho các biến PL/SQL VARCHAR2 cao hơn nhiều so với độ dài tối đa của kiểu dữ liệu VARCHAR2 trong Oracle RDBMS, chỉ là 2000. Do đó, nếu bạn dự định lưu trữ một giá trị PL/SQL VARCHAR2 vào một cột cơ sở dữ liệu VARCHAR2, bạn phải nhớ rằng chỉ có thể chèn 2000 giá trị đầu tiên. Tuy nhiên, cả PL/SQL và SQL đều không tự động giải quyết sự không nhất quán này. Bạn sẽ cần đảm bảo rằng bạn không cố vượt quá 2000 tối đa [thực tế là độ dài tối đa được chỉ định cho cột] thông qua việc sử dụng hàm SUBSTR

Mặt khác, vì độ dài của cột DÀI là hai gigabyte, nên bạn có thể chèn các giá trị PL/SQL VARCHAR2 vào cột DÀI mà không lo bị tràn. [DÀI được thảo luận trong phần tiếp theo. ]

Kiểu dữ liệu VARCHAR thực sự là một kiểu con của VARCHAR2, với cùng phạm vi giá trị được tìm thấy trong VARCHAR2. VARCHAR, nói cách khác, hiện tại đồng nghĩa với VARCHAR2. Việc sử dụng VARCHAR cung cấp khả năng tương thích với cơ sở dữ liệu quan hệ ANSI và IBM. Tuy nhiên, có khả năng lớn là ý nghĩa của VARCHAR có thể thay đổi trong phiên bản mới của tiêu chuẩn ANSI SQL. Oracle khuyên bạn nên tránh sử dụng VARCHAR nếu có thể, và thay vào đó hãy sử dụng VARCHAR2 để khai báo các biến PL/SQL có độ dài thay đổi [và cả các cột trong bảng]

Nếu bạn sử dụng cả chuỗi có độ dài cố định [CHAR] và chuỗi có độ dài thay đổi [VARCHAR2] trong mã PL/SQL của mình, thì bạn nên biết các tương tác sau đây giữa hai kiểu dữ liệu này

  • Chuyển đổi cơ sở dữ liệu thành biến. Khi bạn SELECT hoặc FETCH dữ liệu từ cột cơ sở dữ liệu CHAR vào biến VARCHAR2, các khoảng trắng ở cuối sẽ được giữ lại. Nếu bạn CHỌN hoặc FETCH từ cột cơ sở dữ liệu VARCHAR2 thành biến CHAR, PL/SQL sẽ tự động đệm giá trị bằng khoảng trắng vượt quá độ dài tối đa. Nói cách khác, loại biến, không phải cột, xác định giá trị kết quả của biến

  • Chuyển đổi từ biến sang cơ sở dữ liệu. Khi bạn CHÈN hoặc CẬP NHẬT biến CHAR vào cột cơ sở dữ liệu VARCHAR2, nhân SQL không cắt bỏ các khoảng trống ở cuối trước khi thực hiện thay đổi. Khi PL/SQL sau đây được thực thi, tên công ty trong bản ghi cơ sở dữ liệu mới được đặt thành `ACME SHOWERS��������' [trong đó � biểu thị khoảng trắng]. Nói cách khác, nó được đệm tới 20 ký tự, mặc dù giá trị mặc định là một chuỗi chỉ có 12 ký tự

    bean_counter NUMBER [10,3];
    1

    Mặt khác, khi bạn CHÈN hoặc CẬP NHẬT biến VARCHAR2 vào cột cơ sở dữ liệu CHAR, nhân SQL sẽ tự động đệm chuỗi có độ dài thay đổi bằng khoảng trắng vượt quá độ dài tối đa [cố định] được chỉ định khi bảng được tạo và những vị trí được mở rộng

  • so sánh chuỗi. Giả sử mã của bạn chứa một chuỗi so sánh như sau

    bean_counter NUMBER [10,3];
    2

    PL/SQL phải so sánh company_name với parent_company_name. Nó thực hiện so sánh theo một trong hai cách, tùy thuộc vào loại của hai biến

    • Nếu so sánh được thực hiện giữa hai biến CHAR, thì PL/SQL sử dụng phép so sánh trống. Với cách tiếp cận này, PL/SQL điền các ô trống ngắn hơn trong số hai giá trị vào độ dài của giá trị dài hơn. Sau đó nó thực hiện so sánh. Như vậy với ví dụ trên, nếu tên_công ty được khai báo là CHAR[30] và tên_công ty mẹ được khai báo là CHAR[35], thì PL/SQL sẽ thêm năm khoảng trắng vào cuối giá trị trong tên_công ty rồi thực hiện phép so sánh. Lưu ý rằng PL/SQL không thực sự thay đổi giá trị của biến. Nó sao chép giá trị sang cấu trúc bộ nhớ khác và sau đó sửa đổi dữ liệu tạm thời này để so sánh

    • Nếu ít nhất một trong các chuỗi liên quan đến so sánh có độ dài thay đổi, thì PL/SQL sẽ thực hiện so sánh không đệm trống. Nó không thay đổi bất kỳ giá trị nào, sử dụng độ dài hiện có và thực hiện so sánh. Phân tích so sánh này cũng đúng với các đánh giá liên quan đến nhiều hơn hai biến, như có thể xảy ra với toán tử IN

      bean_counter NUMBER [10,3];
      3

    Nếu bất kỳ biến nào trong bốn biến [menu_selection, hai hằng số được đặt tên và một ký tự đơn] được khai báo là VARCHAR2, thì các phép so sánh chính xác mà không sửa đổi sẽ được thực hiện để xác định xem người dùng có thực hiện lựa chọn hợp lệ hay không. Lưu ý rằng một chữ như OPEN_SCREEN luôn được coi là kiểu dữ liệu CHAR có độ dài cố định

Những quy tắc này có thể làm cho cuộc sống của bạn rất phức tạp. Logic có vẻ hoàn toàn chính xác có thể không hoạt động như mong đợi nếu bạn có sự pha trộn giữa dữ liệu có độ dài cố định và độ dài thay đổi. Xét đoạn sau

bean_counter NUMBER [10,3];
4

Thử nghiệm có điều kiện sẽ không bao giờ trả về TRUE vì giá trị company_name đã được thêm vào độ dài 30 với 21 khoảng trắng. Để giải quyết các vấn đề như thế này, bạn phải luôn RTRIM các giá trị CHAR của mình khi chúng liên quan đến bất kỳ loại so sánh hoặc sửa đổi cơ sở dữ liệu nào

Sẽ hợp lý hơn khi sử dụng RTRIM [để xóa khoảng trắng ở cuối] so với sử dụng RPAD [để đệm các chuỗi có độ dài thay đổi bằng khoảng trắng]. Với RPAD, bạn phải biết độ dài bạn muốn đệm chuỗi có độ dài thay đổi để khớp với chuỗi có độ dài cố định. Với RTRIM, bạn chỉ cần loại bỏ tất cả các khoảng trống và để PL/SQL thực hiện phép so sánh không đệm trống của nó

Thật dễ dàng phát hiện ra vấn đề trong khối PL/SQL ẩn danh này vì tất cả các câu lệnh liên quan đều gần nhau. Thật không may, trong thế giới thực, giá trị của các biến thường được đặt theo cách ít rõ ràng hơn nhiều và thường ở một phần khác của mã với câu lệnh điều kiện không thành công. Vì vậy, nếu bạn phải sử dụng các biến có độ dài cố định, hãy chú ý đến logic tin tưởng một cách ngây thơ rằng khoảng trắng ở cuối không phải là vấn đề

4. 2. 3. 3 Kiểu dữ liệu LONG

Một biến được khai báo là LONG có thể lưu trữ các chuỗi có độ dài thay đổi lên tới 32760 byte -- đây thực sự là ít hơn bảy byte so với mức cho phép trong các biến loại VARCHAR2. Kiểu dữ liệu LONG cho các biến PL/SQL khá khác với kiểu dữ liệu LONG cho các cột trong Máy chủ Oracle. Kiểu dữ liệu LONG trong Oracle7 có thể lưu trữ các chuỗi ký tự lên đến hai gigabyte hoặc 231-1 byte;

Do những khác biệt về độ dài tối đa này, bạn luôn có thể chèn giá trị biến PL/SQL DÀI vào cột cơ sở dữ liệu DÀI, nhưng bạn không thể chọn giá trị cơ sở dữ liệu DÀI lớn hơn 32760 byte vào biến DÀI PL/SQL

Trong cơ sở dữ liệu Oracle, có nhiều hạn chế về cách sử dụng cột DÀI trong câu lệnh SQL;

  • Một bảng không được chứa nhiều hơn một cột DÀI

  • Bạn không được sử dụng cột DÀI trong mệnh đề GROUP BY, ORDER BY, WHERE hoặc CONNECT BY

  • Bạn không thể áp dụng các hàm ký tự [chẳng hạn như SUBSTR, INSTR hoặc LENGTH] cho cột DÀI

Các biến PL/SQL LONG không có các hạn chế này. Trong mã PL/SQL của bạn, bạn có thể sử dụng một biến được khai báo là DÀI giống như cách bạn sử dụng một biến được khai báo là VARCHAR2. Bạn có thể áp dụng các hàm ký tự cho biến. Bạn có thể sử dụng nó trong mệnh đề WHERE của câu lệnh CHỌN hoặc CẬP NHẬT. Tất cả điều này đều hợp lý vì ít nhất là từ quan điểm về kích thước tối đa của các biến, thực sự có rất ít sự khác biệt giữa VARCHAR2 và LONG trong PL/SQL

Với thực tế là biến VARCHAR2 thực sự có độ dài tối đa cao hơn LONG và không có hạn chế nào kèm theo, tôi khuyên bạn nên luôn sử dụng kiểu dữ liệu VARCHAR2 trong các chương trình PL/SQL. LONG có một vị trí trong RDBMS, nhưng vai trò đó không bị trùng lặp trong PL/SQL. Điều này có ý nghĩa vì bạn sẽ rất hiếm khi muốn thao tác các chuỗi thực sự lớn trong chương trình của mình bằng cách sử dụng các hàm như SUBSTR hoặc LENGTH hoặc INSTR

4. 2. 3. 4 Kiểu dữ liệu RAW

Kiểu dữ liệu RAW được sử dụng để lưu trữ dữ liệu nhị phân hoặc các loại dữ liệu thô khác, chẳng hạn như ảnh hoặc hình ảnh được số hóa. Một biến RAW có cùng độ dài tối đa như VARCHAR2 [32767 byte], cũng phải được chỉ định khi khai báo biến. Sự khác biệt giữa RAW và VARCHAR2 là PL/SQL sẽ không cố diễn giải dữ liệu thô. Trong Oracle RDBMS, điều này có nghĩa là Oracle sẽ không thực hiện chuyển đổi bộ ký tự trên dữ liệu RAW khi nó được chuyển từ một hệ thống [ví dụ: dựa trên ASCII 7 bit] sang hệ thống khác

Một lần nữa, có sự không nhất quán giữa độ dài tối đa PL/SQL cho biến RAW [32767] và độ dài tối đa RDBMS [255]. Do đó, bạn không thể chèn hơn 255 byte giá trị của biến PL/SQL RAW vào một cột cơ sở dữ liệu. Mặt khác, bạn có thể chèn toàn bộ giá trị của biến PL/SQL RAW vào một cột có loại LONG RAW, là vùng chứa hai gigabyte cho dữ liệu thô trong cơ sở dữ liệu

4. 2. 3. 5 Kiểu dữ liệu LONG RAW

Kiểu dữ liệu LONG RAW lưu trữ dữ liệu thô lên tới 32760 byte và giống như kiểu dữ liệu LONG ngoại trừ dữ liệu trong biến LONG RAW không được diễn giải bởi PL/SQL

Với thực tế là một biến RAW thực sự có độ dài tối đa cao hơn LONG RAW và không có hạn chế nào kèm theo, tôi khuyên bạn nên luôn sử dụng kiểu dữ liệu RAW trong các chương trình PL/SQL. LONG RAW có một vị trí trong RDBMS, nhưng vai trò đó không bị trùng lặp trong PL/SQL

4. 2. 3. 6 Kiểu dữ liệu ROWID

Trong Oracle RDBMS, ROWID là một cột giả là một phần của mọi bảng bạn tạo. Rowid là một giá trị nhị phân được tạo và duy trì nội bộ, xác định một hàng dữ liệu trong bảng của bạn. Nó được gọi là cột giả vì câu lệnh SQL bao gồm nó ở những nơi mà bạn thường sử dụng cột. Tuy nhiên, đó không phải là cột mà bạn tạo cho bảng. Thay vào đó, RDBMS tạo rowid cho mỗi hàng khi nó được chèn vào cơ sở dữ liệu. Thông tin trong rowid cung cấp vị trí vật lý chính xác của hàng trong cơ sở dữ liệu. Bạn không thể thay đổi giá trị của rowid

Bạn có thể sử dụng kiểu dữ liệu ROWID để lưu trữ các rowid từ cơ sở dữ liệu trong chương trình pl/sql của mình. Bạn có thể CHỌN hoặc FETCH rowid cho một hàng thành biến ROWID. Để thao tác với các rowid trong Oracle8, bạn sẽ muốn sử dụng gói tích hợp sẵn, dbms_rowid [xem Phụ lục A, Có gì trên Đĩa Đồng hành? ]. Trong Oracle7, bạn sẽ sử dụng hàm rowidtochar để chuyển đổi rowid thành một chuỗi có độ dài cố định và sau đó thực hiện các thao tác đối với chuỗi đó

Trong Oracle7, định dạng của rowid có độ dài cố định như sau

bean_counter NUMBER [10,3];
5

Các thành phần của định dạng này có ý nghĩa như sau

BBBBBBB

Khối trong tệp cơ sở dữ liệu

RRRR

Hàng trong khối [trong đó hàng đầu tiên bằng 0, không phải một]

FFFFF

Tệp cơ sở dữ liệu

Tất cả những con số này là hệ thập lục phân;

Trong Oracle8, rowid đã được "mở rộng" để hỗ trợ các bảng và chỉ mục được phân vùng. Rowids mới, mở rộng bao gồm số đối tượng dữ liệu, xác định phân đoạn cơ sở dữ liệu. Bất kỳ đối tượng lược đồ nào được tìm thấy trong cùng một phân đoạn, chẳng hạn như một cụm bảng, sẽ có cùng một số đối tượng. Sau đó, trong Oracle8, một rowid chứa thông tin sau

  • Số đối tượng dữ liệu

  • Tệp dữ liệu [trong đó tệp đầu tiên là 1]

  • Khối dữ liệu trong tệp dữ liệu

  • Hàng trong khối dữ liệu [trong đó hàng đầu tiên là 0]

Oracle8 cung cấp các chức năng trong gói dbms_rowid để chuyển đổi giữa các định dạng mới của rowids

Thông thường [và luôn luôn trong Oracle7], một rowid sẽ xác định duy nhất một hàng dữ liệu. Tuy nhiên, trong Oracle8, các hàng trong các bảng khác nhau được lưu trữ trong cùng một cụm có thể có cùng giá trị rowid

Bây giờ bạn có thể đang nghĩ, "Tại sao anh ấy lại nói với tôi điều này? Tôi có thực sự phải biết về các khối vật lý trong Oracle RDBMS không? Tôi nghĩ toàn bộ điểm của phương pháp quan hệ là tôi có thể tập trung vào thiết kế logic của dữ liệu của mình . Rowids thật đáng sợ. "

Bình tĩnh. Rất hiếm khi bạn muốn sử dụng rowid và trong những trường hợp đó, có lẽ bạn sẽ không quan tâm đến cấu trúc bên trong của nó. Bạn chỉ cần sử dụng nó để tìm một hàng trong cơ sở dữ liệu. Truy cập bằng rowid thường là cách nhanh nhất để xác định vị trí hoặc truy xuất một hàng cụ thể trong cơ sở dữ liệu. nhanh hơn cả tìm kiếm theo khóa chính

Bạn có thể sử dụng rowid trong ứng dụng Oracle Forms để truy cập hàng trong cơ sở dữ liệu tương ứng với bản ghi trên màn hình. Khi bạn tạo một khối bảng cơ sở trong Biểu mẫu Oracle, nó sẽ tự động bao gồm rowid trong khối dưới dạng "giả mục vô hình. " Bạn không nhìn thấy nó trong danh sách mục của mình, nhưng bạn có thể tham khảo nó trong trình kích hoạt và đơn vị chương trình PL/SQL của mình. Ví dụ: để cập nhật tên của một nhân viên được hiển thị trên màn hình, bạn có thể đưa ra câu lệnh sau

bean_counter NUMBER [10,3];
6

Bạn cũng có thể sử dụng rowid bên trong vòng lặp FOR con trỏ [hoặc bất kỳ vòng lặp nào khác mà FETCHes ghi từ một con trỏ] để thực hiện các thay đổi đối với hàng vừa FETCHed, như sau

bean_counter NUMBER [10,3];
7

XÓA sử dụng rowid được lưu trữ trong bản ghi emp_rec để loại bỏ ngay lập tức bất kỳ ai kiếm được hơn 50.000 đô la mà không có mối liên hệ đã biết với Chủ tịch hoặc Giám đốc điều hành. Lưu ý rằng DBA kiểm soát những người có thể có đặc quyền EXECUTE đối với thủ tục được lưu trữ này. Vì vậy, bây giờ người ta phải tự hỏi. DBA có kết nối với Chủ tịch hoặc Giám đốc điều hành không?

Tất nhiên, quy trình trên cũng có thể chỉ đơn giản là tìm nạp employee_id [khóa chính của bảng nhân viên] và thực hiện XÓA dựa trên cột thực đó, như trong

bean_counter NUMBER [10,3];
8

Tôi không tin rằng hiệu suất lý thuyết đạt được khi tìm kiếm bằng rowid biện minh cho việc sử dụng nó. Mã kết quả khó hiểu hơn so với việc sử dụng khóa chính dành riêng cho ứng dụng. Hơn nữa, các tham chiếu đến rowid có thể gây ra sự cố về tính di động trong tương lai. [ ]

Ngôn ngữ Oracle RDBMS/SQL cung cấp các tính năng không có trong PL/SQL, chẳng hạn như cấu trúc GIẢI MÃ SQL của Oracle. Mặt khác, PL/SQL có một vài thủ thuật không có sẵn trong SQL gốc. Một ví dụ đặc biệt thú vị về điều này là kiểu dữ liệu BOOLEAN. [ ] Dữ liệu Boolean chỉ có thể là TRUE, FALSE hoặc NULL. Boolean là một kiểu dữ liệu "logic"

Oracle RDBMS không hỗ trợ kiểu dữ liệu Boolean. Bạn có thể tạo một bảng có một cột kiểu dữ liệu CHAR[1] và lưu trữ "Y" hoặc "N" trong cột đó để biểu thị TRUE hoặc FALSE. Tuy nhiên, đó là một sự thay thế kém cho một kiểu dữ liệu lưu trữ các giá trị Boolean thực tế đó [hoặc NULL]

Bởi vì không có bản sao cho Boolean PL/SQL trong Oracle RDBMS, bạn không thể CHỌN vào một biến Boolean cũng như không thể chèn trực tiếp giá trị TRUE hoặc FALSE vào cột cơ sở dữ liệu

Các giá trị và biến Boolean rất hữu ích trong PL/SQL. Vì biến Boolean chỉ có thể là TRUE, FALSE hoặc NULL, nên bạn có thể sử dụng biến đó để giải thích điều gì đang xảy ra trong mã của mình. Với Booleans, bạn có thể viết mã dễ đọc vì nó giống tiếng Anh hơn. Bạn có thể thay thế một biểu thức Boolean phức tạp bao gồm nhiều biến và kiểm tra khác nhau bằng một biến Boolean duy nhất biểu thị trực tiếp ý định và ý nghĩa của văn bản

Hầu hết các ứng dụng của chúng tôi yêu cầu lưu trữ và thao tác ngày và giờ. Ngày khá phức tạp. chúng không chỉ là dữ liệu có định dạng cao mà còn có vô số quy tắc để xác định giá trị hợp lệ và phép tính hợp lệ [ngày và năm nhuận, ngày lễ quốc gia và ngày lễ của công ty, phạm vi ngày, v.v. ]. May mắn thay, Oracle RDBMS và PL/SQL cung cấp cho chúng tôi trợ giúp theo nhiều cách để xử lý thông tin ngày tháng

RDBMS cung cấp kiểu dữ liệu DATE thực lưu trữ cả thông tin ngày và giờ. Mặc dù bạn có thể nhập giá trị ngày ở nhiều định dạng khác nhau, RDBMS lưu trữ ngày ở định dạng nội bộ, tiêu chuẩn. Đó là một giá trị có độ dài cố định sử dụng bảy byte. Bạn thực sự không thể chỉ định giá trị nội bộ hoặc giá trị bằng chữ này bằng một phép gán. Thay vào đó, bạn dựa vào việc chuyển đổi ngầm định các giá trị ký tự và số thành một ngày thực tế hoặc chuyển đổi rõ ràng bằng hàm TO_DATE. [Phần tiếp theo mô tả các loại chuyển đổi này. ] PL/SQL cung cấp kiểu dữ liệu DATE tương ứng trực tiếp với RDBMS DATE

Oracle DATE lưu trữ các thông tin sau

thế kỉnămthángngàygiờphútgiây

PL/SQL xác thực và lưu trữ các ngày rơi vào khoảng ngày 1 tháng 1 năm 4712 B. C. đến ngày 31 tháng 12 năm 4712 A. D. Thành phần thời gian của một ngày được lưu trữ dưới dạng số giây sau nửa đêm. Nếu bạn nhập một ngày mà không có thời gian [nhiều ứng dụng không yêu cầu theo dõi thời gian, vì vậy PL/SQL cho phép bạn bỏ qua], phần thời gian của giá trị cơ sở dữ liệu mặc định là nửa đêm [12. 00. 00 giờ sáng]

Cả kiểu dữ liệu Oracle RDBMS DATE và PL/SQL DATE đều không lưu trữ thời gian theo gia số nhỏ hơn một giây. Do đó, kiểu dữ liệu DATE không hữu ích cho việc theo dõi các hoạt động thời gian thực xảy ra trong khoảng thời gian dưới giây. Nếu bạn cần theo dõi thời gian ở các khoảng thời gian dưới giây, thay vào đó, bạn có thể lưu trữ thông tin này dưới dạng số. Bạn có thể lấy thời gian dưới giây bằng cách sử dụng hàm GET_TIME của gói DBMS_UTILITY được mô tả trong Phụ lục C, Gói tích hợp

Vì một biến được khai báo DATE là một ngày thực và không chỉ đơn giản là biểu diễn ký tự của một ngày, nên bạn có thể thực hiện phép tính số học trên các biến ngày, chẳng hạn như phép trừ một ngày với một ngày khác hoặc cộng/trừ các số với một ngày. Bạn có thể sử dụng các hàm ngày tháng, được mô tả trong Chương 12, Các hàm ngày tháng, cung cấp một loạt các thao tác mạnh mẽ về ngày tháng. Sử dụng hàm SYSDATE để trả về ngày và giờ hiện tại của hệ thống. Bạn cũng có thể sử dụng hàm chuyển đổi TO_CHAR [được mô tả trong Chương 14, Hàm chuyển đổi] để chuyển đổi ngày thành chuỗi ký tự hoặc thành số

Trong PL/SQL, ngày Julian là số ngày kể từ ngày hợp lệ đầu tiên, ngày 1 tháng 1 năm 4712 trước Công nguyên. Sử dụng ngày Julian nếu bạn cần thực hiện tính toán hoặc hiển thị thông tin ngày với một điểm tham chiếu duy nhất và hẹn hò liên tục

Khi làm việc với các ngôn ngữ như tiếng Nhật, bộ ký tự ASCII 8 bit đơn giản là không thể biểu thị tất cả các ký tự có sẵn. Những ngôn ngữ như vậy yêu cầu 16 bit [hai byte] để biểu diễn từng ký tự. Oracle cung cấp Hỗ trợ Ngôn ngữ Quốc gia [NLS] để xử lý dữ liệu ký tự một byte và nhiều byte. Các tính năng của NLS cũng cho phép bạn chuyển đổi giữa các bộ ký tự. PL/SQL8 hỗ trợ hai bộ ký tự cho phép lưu trữ và thao tác các chuỗi ở định dạng một byte hoặc nhiều byte. Hai bộ ký tự là

  • Bộ ký tự cơ sở dữ liệu. được sử dụng cho mã định danh PL/SQL và mã nguồn

  • Bộ chữ quốc gia. được sử dụng cho dữ liệu NLS

PL/SQL cung cấp hai kiểu dữ liệu, NCHAR và NVARCHAR2, để lưu trữ các chuỗi ký tự được hình thành từ bộ ký tự quốc gia

4. 2. 6. 1 Kiểu dữ liệu NCHAR

Sử dụng kiểu dữ liệu NCHAR để lưu trữ dữ liệu ký tự nls có độ dài cố định. Biểu diễn bên trong của dữ liệu được xác định bởi bộ ký tự quốc gia. Khi bạn khai báo một biến kiểu này, bạn cũng có thể chỉ định độ dài của nó. Nếu bạn không cung cấp độ dài, giá trị mặc định là 1 sẽ được sử dụng

Đây là khai báo của một biến NCHAR có độ dài là 10

bean_counter NUMBER [10,3];
9

Đây là khai báo của một biến NCHAR với độ dài mặc định là 1

big_whole_number NUMBER;
0

Độ dài tối đa cho các biến NCHAR là 32767

Nhưng "độ dài 10" thực sự có nghĩa là gì? . Nếu bộ ký tự quốc gia là bộ ký tự có độ rộng thay đổi [JA16SJIS là một ví dụ], thì độ dài biểu thị độ dài tính bằng byte

4. 2. 6. 2 Kiểu dữ liệu NVARCHAR2

Sử dụng kiểu dữ liệu nvarchar2 để lưu trữ dữ liệu ký tự nls có độ dài thay đổi. Biểu diễn bên trong của dữ liệu được xác định bởi bộ ký tự quốc gia. Khi bạn khai báo một biến kiểu này, bạn cũng phải chỉ định độ dài của nó.

Đây là khai báo của một biến nvarchar2 với độ dài tối đa là 200

big_whole_number NUMBER;
1

Độ dài tối đa được phép cho các biến nvarchar2 là 32767. Độ dài có cùng ý nghĩa được mô tả ở trên cho nchar

Oracle8 và PL/SQL8 hỗ trợ một số biến thể của kiểu dữ liệu LOB [đối tượng lớn]. LOB có thể lưu trữ một lượng lớn [tối đa bốn gigabyte] dữ liệu thô, dữ liệu nhị phân [chẳng hạn như hình ảnh] hoặc dữ liệu văn bản ký tự

Trong PL/SQL, bạn có thể khai báo các biến LOB của các kiểu dữ liệu sau

BFILE

Khai báo các biến chứa bộ định vị tệp trỏ đến các đối tượng nhị phân lớn trong các tệp hệ điều hành bên ngoài cơ sở dữ liệu

BÃI

Khai báo các biến chứa bộ định vị LOB trỏ đến một đối tượng nhị phân lớn

CLOB

Khai báo các biến chứa bộ định vị LOB trỏ đến một khối lớn dữ liệu ký tự có độ rộng cố định một byte

NCLOB

Khai báo các biến chứa bộ định vị LOB trỏ đến một khối lớn dữ liệu ký tự nhiều byte một byte hoặc có độ rộng cố định

Có hai loại LOB trong Oracle8. Nội bô và ngoại bộ. LOB bên trong [BLOB, CLOB và NCLOB] được lưu trữ trong cơ sở dữ liệu và có thể tham gia vào một giao dịch trong máy chủ cơ sở dữ liệu. LOB bên ngoài [BFILE] là dữ liệu nhị phân lớn được lưu trữ trong các tệp hệ điều hành bên ngoài không gian bảng cơ sở dữ liệu. LOB bên ngoài không thể tham gia giao dịch. Nói cách khác, bạn không thể cam kết hoặc khôi phục các thay đổi đối với BFILE. Thay vào đó, bạn dựa vào hệ thống tệp cơ bản để đảm bảo tính toàn vẹn của dữ liệu

4. 2. 7. 1 Kiểu dữ liệu BFILE

Sử dụng kiểu dữ liệu BFILE để lưu trữ các đối tượng nhị phân lớn [kích thước tối đa bốn gigabyte] trong các tệp bên ngoài cơ sở dữ liệu. Biến này cung cấp cho bạn quyền truy cập I/O luồng byte, chỉ đọc vào các tệp này [có thể nằm trên đĩa cứng, CD-ROM hoặc thiết bị tương tự khác]

Khi bạn khai báo một biến BFILE, bạn cấp phát bộ nhớ để lưu bộ định vị tệp của BFILE, chứ không phải chính nội dung của BFILE. Trình định vị tệp này chứa bí danh thư mục cũng như tên tệp. Xem phần sau của chương này để biết thêm thông tin về bộ định vị tệp

Dưới đây là một ví dụ về khai báo biến BFILE

big_whole_number NUMBER;
2

4. 2. 7. 2 Kiểu dữ liệu BLOB

Sử dụng kiểu dữ liệu BLOB để lưu trữ các đối tượng nhị phân lớn "ngoài dòng" bên trong cơ sở dữ liệu. Điều này có nghĩa là khi một bảng có một cột BLOB, một hàng dữ liệu cho bảng đó chứa một con trỏ hoặc một bộ định vị đến vị trí thực của dữ liệu BLOB [do đó, nó không "thẳng hàng" với các giá trị cột khác của hàng]

Biến BLOB chứa bộ định vị, sau đó trỏ đến đối tượng nhị phân lớn. BLOB có thể có kích thước lên tới bốn gigabyte và chúng tham gia đầy đủ vào các giao dịch. Nói cách khác, bất kỳ thay đổi nào bạn thực hiện đối với BLOB [thông qua gói tích hợp DBMS_LOB] đều có thể được khôi phục hoặc cam kết cùng với các thay đổi nổi bật khác trong giao dịch của bạn. Tuy nhiên, bộ định vị BLOB không thể mở rộng các giao dịch hoặc phiên

Dưới đây là một ví dụ về khai báo biến BLOB

big_whole_number NUMBER;
3

4. 2. 7. 3 Kiểu dữ liệu CLOB

Sử dụng kiểu dữ liệu CLOB để lưu trữ các khối lớn dữ liệu ký tự một byte "ngoài dòng" bên trong cơ sở dữ liệu. Điều này có nghĩa là khi một bảng có cột CLOB, một hàng dữ liệu cho bảng đó chứa một con trỏ hoặc bộ định vị đến vị trí thực tế của dữ liệu CLOB [vì vậy nó không "thẳng hàng" với các giá trị cột khác của hàng]

Biến CLOB chứa bộ định vị, sau đó trỏ đến khối lớn dữ liệu ký tự một byte. CLOB có thể có kích thước lên tới bốn gigabyte và chúng tham gia đầy đủ vào các giao dịch. Nói cách khác, bất kỳ thay đổi nào bạn thực hiện đối với CLOB [thông qua gói tích hợp DBMS_LOB] đều có thể được khôi phục hoặc cam kết cùng với các thay đổi nổi bật khác trong giao dịch của bạn. Tuy nhiên, bộ định vị CLOB không thể mở rộng các giao dịch hoặc phiên

Bộ ký tự có chiều rộng thay đổi không được hỗ trợ trong CLOB

Dưới đây là một ví dụ về khai báo biến CLOB

big_whole_number NUMBER;
4

4. 2. 7. 4 Kiểu dữ liệu NCLOB

Sử dụng kiểu dữ liệu NCLOB để lưu trữ các khối lớn dữ liệu ký tự nhiều byte một byte hoặc độ rộng cố định "ngoài dòng" bên trong cơ sở dữ liệu. Điều này có nghĩa là khi một bảng có cột NCLOB, một hàng dữ liệu cho bảng đó chứa một con trỏ hoặc bộ định vị đến vị trí thực tế của dữ liệu NCLOB [do đó, nó không "thẳng hàng" với các giá trị cột khác của hàng]

Biến NCLOB chứa bộ định vị, sau đó trỏ đến khối lớn dữ liệu ký tự một byte. NCLOB có thể có kích thước lên tới bốn gigabyte và chúng tham gia đầy đủ vào các giao dịch. Nói cách khác, bất kỳ thay đổi nào bạn thực hiện đối với NCLOB [thông qua gói tích hợp DBMS_LOB] đều có thể được khôi phục hoặc cam kết cùng với các thay đổi nổi bật khác trong giao dịch của bạn. Tuy nhiên, bộ định vị NCLOB không thể mở rộng các giao dịch hoặc phiên

Bộ ký tự có độ rộng thay đổi không được hỗ trợ trong NCLOB

Dưới đây là một ví dụ về khai báo biến NCLOB

big_whole_number NUMBER;
5

4. 2. 7. 5 LOB và DÀI

Các loại LOB khác với và tốt hơn là LONG và LONG RAW. Kích thước tối đa của LONG là hai gigabyte, trong khi kích thước tối đa của LOB là bốn gigabyte

Oracle cung cấp gói tích hợp mới mạnh mẽ, DBMS_LOB, để giúp bạn thao tác nội dung của LOB theo cách không thể thực hiện được với LONG. Nói chung, Oracle cung cấp cho bạn quyền truy cập ngẫu nhiên vào nội dung LOB, trong khi với LONG, bạn chỉ có quyền truy cập tuần tự. Ví dụ: với DBMS_LOB, bạn có thể thực hiện các thao tác SUBSTR và INSTR đối với LOB. Điều này là không thể với dữ liệu DÀI

Oracle khuyên bạn không nên sử dụng LONG hoặc LONG RAW trong các ứng dụng của mình nữa và thay vào đó hãy tận dụng các tính năng mới và cải tiến của kiểu dữ liệu LOB. Nếu bạn sắp làm việc với các loại đối tượng, bạn thực sự không có nhiều lựa chọn. một LOB [ngoại trừ NCLOB] có thể là một thuộc tính của một loại đối tượng, nhưng LONG thì không thể

4. 2. 7. 6 Làm việc với LOB

Các giá trị LOB không được lưu trữ "cùng hàng" với dữ liệu hàng khác. Thay vào đó, một bộ định vị LOB, trỏ đến LOB, được lưu trữ trong hàng. Giả sử rằng tôi đã tạo bảng sau

big_whole_number NUMBER;
6

Sau đó, tôi có thể hiển thị số lượng ký tự trong cuốn sách The Bell Curve với đoạn mã sau

big_whole_number NUMBER;
7

Đây là một ví dụ về sao chép BLOB từ hàng này sang hàng khác trong SQL

big_whole_number NUMBER;
8

Trong tình huống này, tôi đã chỉ định một công cụ định vị LOB mới cho ấn bản thứ hai của mình. Tôi cũng đã sao chép giá trị LOB [nội dung của ấn bản đầu tiên của tôi] vào hàng mới này, chứ không chỉ tạo một bộ định vị hoặc con trỏ khác quay lại cùng một văn bản

Lưu ý rằng tôi đã sao chép toàn bộ nội dung cuốn sách của mình. Các hoạt động DML như INSERT và UPDATE luôn ảnh hưởng đến toàn bộ LOB. Nếu bạn muốn thay đổi hoặc xóa chỉ một phần của LOB, bạn cần gọi các hàm thích hợp trong gói DBMS_LOB

Bạn không thể sao chép trực tiếp các giá trị giữa ký tự LOB và biến VARCHAR2, ngay cả khi giá trị LOB nhỏ và "vừa" bên trong biến VARCHAR2 đã chỉ định. Tuy nhiên, bạn có thể sử dụng các hàm trong gói DBMS_LOB để trích xuất một số hoặc tất cả giá trị CLOB và đặt giá trị đó vào một biến VARCHAR2 [như ví dụ sau minh họa]

big_whole_number NUMBER;
9

4. 2. 7. 7 Làm việc với BFILE

BFILE rất khác với LOB nội bộ theo một số cách

  • Giá trị của BFILE được lưu trữ trong tệp hệ điều hành, hoàn toàn không nằm trong cơ sở dữ liệu

  • BFILEs không tham gia giao dịch [i. e. , các thay đổi đối với BFILE không thể được khôi phục hoặc cam kết]

Khi bạn làm việc với BFILEs trong PL/SQL, bạn vẫn làm việc với bộ định vị LOB. Tuy nhiên, trong trường hợp BFILE, bộ định vị chỉ trỏ đến tệp được lưu trữ trên máy chủ. Vì lý do này, hai hàng khác nhau trong một bảng cơ sở dữ liệu có thể có một cột BFILE trỏ đến cùng một tệp

Trình định vị BFILE bao gồm bí danh thư mục và tên tệp. Bạn sử dụng hàm BFILENAME [xem Chương 13, Các hàm số, LOB và các hàm khác ] để trả về một bộ định vị dựa trên hai mẩu thông tin đó

Trong khối tiếp theo, tôi khai báo một biến BFILE và gán cho nó một bộ định vị cho một tệp có tên family. ipg nằm trong "thư mục" ảnh

rounded_million NUMBER [10,-6];
0

Nhưng "hình ảnh" chính xác là gì? . Trên thực tế, nó là một đối tượng cơ sở dữ liệu được gọi là DIRECTORY. Đây là tuyên bố tôi sẽ sử dụng để tạo một thư mục

rounded_million NUMBER [10,-6];
1

Bạn sẽ cần các đặc quyền CREATE DIRECTORY hoặc CREATE ANY DIRECTORY để tạo một thư mục. Để có thể tham khảo thư mục này, bạn phải được cấp đặc quyền ĐỌC, như trong

rounded_million NUMBER [10,-6];
2

Để biết thêm thông tin về bí danh thư mục, xem trong Chương 13

Số lượng BFILE tối đa có thể mở trong một phiên được thiết lập theo tham số khởi tạo cơ sở dữ liệu, SESSION_MAX_OPEN_FILES. Tham số này xác định giới hạn trên đối với số lượng tệp được mở đồng thời trong một phiên [không chỉ BFILE mà tất cả các loại tệp, kể cả những tệp được mở bằng gói UTL_FILE]

Cả SQL và PL/SQL đều cung cấp nhiều loại dữ liệu khác nhau. Trong nhiều trường hợp --thường xuyên hơn bạn có thể muốn thừa nhận --bạn sẽ thấy cần phải chuyển đổi dữ liệu của mình từ kiểu dữ liệu này sang kiểu dữ liệu khác

Bạn có thể có một bảng lưu trữ thông tin khóa chính dưới dạng chuỗi ký tự và một bảng khác lưu trữ cùng khóa đó dưới dạng khóa ngoại ở định dạng số. Khi bạn thực hiện một nhiệm vụ, bạn sẽ cần chuyển đổi thông tin

rounded_million NUMBER [10,-6];
3

Bạn có thể muốn xem một giá trị rowid, trong trường hợp đó cần phải chuyển đổi giá trị đó sang định dạng ký tự [hex], như sau

rounded_million NUMBER [10,-6];
4

Hoặc bạn có thể thực hiện so sánh ngày bằng cách chỉ định ngày dưới dạng chữ, như sau

rounded_million NUMBER [10,-6];
5

Bất cứ khi nào PL/SQL thực hiện một thao tác liên quan đến một hoặc nhiều giá trị, trước tiên nó phải chuyển đổi dữ liệu sao cho có định dạng phù hợp với thao tác đó. Có hai loại chuyển đổi. rõ ràng và tiềm ẩn

4. 2. 8. 1 chuyển đổi dữ liệu rõ ràng

Chuyển đổi rõ ràng diễn ra khi bạn sử dụng chức năng chuyển đổi tích hợp để buộc chuyển đổi giá trị từ kiểu dữ liệu này sang kiểu dữ liệu khác. Trong ví dụ trước minh họa việc xem giá trị rowid, tôi đã sử dụng hàm chuyển đổi ROWIDTOCHAR để hàm PUT_LINE có thể hiển thị chuỗi ký tự kết quả. PL/SQL cung cấp đầy đủ các hàm chuyển đổi để cho phép chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác. [Các chức năng này được khám phá đầy đủ hơn trong Chương 14. ]

4. 2. 8. 2 Chuyển đổi dữ liệu ngầm định

Bất cứ khi nào PL/SQL phát hiện ra rằng một chuyển đổi là cần thiết, nó sẽ cố gắng thay đổi các giá trị cần thiết để thực hiện thao tác. Bạn có thể sẽ ngạc nhiên khi biết tần suất PL/SQL thực hiện các chuyển đổi thay cho bạn. hiển thị những loại chuyển đổi ẩn mà PL/SQL có thể thực hiện

hinh 4. 1. Chuyển đổi ngầm được thực hiện bởi PL/SQL

Với các chuyển đổi ẩn, bạn có thể chỉ định các giá trị bằng chữ thay cho dữ liệu với định dạng bên trong chính xác và PL/SQL sẽ chuyển đổi chữ đó khi cần thiết. Trong ví dụ bên dưới, PL/SQL chuyển đổi chuỗi ký tự "125" thành giá trị số 125 trong quá trình gán giá trị cho biến số

rounded_million NUMBER [10,-6];
6

Bạn cũng có thể chuyển các tham số của một kiểu dữ liệu vào một mô-đun và sau đó yêu cầu PL/SQL chuyển đổi dữ liệu đó sang định dạng khác để sử dụng bên trong chương trình. Trong quy trình sau, tham số đầu tiên là một ngày. Khi tôi gọi thủ tục đó, tôi chuyển một giá trị chuỗi ở dạng DD-MON-YY và PL/SQL tự động chuyển đổi chuỗi đó thành một ngày

rounded_million NUMBER [10,-6];
7

Như được hiển thị trong , chuyển đổi bị hạn chế; . Hơn nữa, một số chuyển đổi tiềm ẩn làm tăng ngoại lệ. Xét bài tập sau

rounded_million NUMBER [10,-6];
8

PL/SQL không thể chuyển đổi "abc" thành một số và do đó sẽ làm tăng ngoại lệ VALUE_ERROR khi nó thực thi mã này. Tùy thuộc vào bạn để đảm bảo rằng nếu PL/SQL sẽ thực hiện các chuyển đổi ẩn, thì nó sẽ được cung cấp các giá trị mà nó có thể chuyển đổi mà không gặp lỗi

4. 2. 8. 3 Hạn chế của chuyển đổi ngầm định

Có một số nhược điểm đối với chuyển đổi ngầm định

  • Mỗi chuyển đổi ẩn mà PL/SQL thực hiện thể hiện một sự mất mát, dù nhỏ, trong quyền kiểm soát mà bạn có đối với chương trình của mình. Bạn không thực hiện hoặc chỉ đạo việc thực hiện chuyển đổi đó một cách rõ ràng; . Luôn luôn có một mối nguy hiểm trong việc đưa ra giả định này. Nếu Oracle thay đổi cách thức và hoàn cảnh thực hiện chuyển đổi;

  • Chuyển đổi ẩn mà PL/SQL thực hiện phụ thuộc vào ngữ cảnh mà mã xảy ra. Do đó, một chuyển đổi có thể xảy ra trong một chương trình và không xảy ra trong một chương trình khác mặc dù chúng có vẻ giống nhau. Chuyển đổi PL/SQL thực hiện không nhất thiết phải luôn là chuyển đổi mà bạn có thể mong đợi

  • Chuyển đổi ngầm thực sự có thể làm giảm hiệu suất. Sự phụ thuộc vào chuyển đổi ẩn có thể dẫn đến chuyển đổi quá mức diễn ra hoặc chuyển đổi giá trị cột trong câu lệnh SQL thay vì trong hằng số

  • Mã của bạn sẽ dễ đọc và dễ hiểu hơn nếu bạn chuyển đổi rõ ràng dữ liệu khi cần. Các chuyển đổi như vậy ghi lại sự khác biệt về kiểu dữ liệu giữa các bảng hoặc giữa mã và bảng. Bằng cách loại bỏ một giả định và một hành động ẩn khỏi mã của bạn, bạn cũng loại bỏ một sự hiểu lầm tiềm ẩn

Do đó, tôi khuyên bạn nên tránh cho phép ngôn ngữ SQL hoặc PL/SQL thực hiện chuyển đổi ngầm định thay cho bạn. Bất cứ khi nào có thể, hãy sử dụng chức năng chuyển đổi để đảm bảo rằng loại chuyển đổi phù hợp diễn ra

Kiểu dữ liệu vô hướng trong C là gì?

Kiểu dữ liệu vô hướng là kiểu dữ liệu có giá trị đơn, có thể được sử dụng cho các biến, hằng số riêng lẻ, v.v. . char là câu trả lời đúng. "Vô hướng" là kiểu dữ liệu chỉ có thể chứa một. giá trị tại một thời điểm [trái ngược với một mảng].

Kiểu dữ liệu vô hướng trong Python là gì?

Các loại vô hướng . Bất kỳ số thực nào có biểu diễn dấu phẩy động trong đó thành phần phân số được biểu thị bằng ký hiệu thập phân hoặc ký hiệu khoa học e. g. 1. 23, 3. 4556789e2. phức tạp. Một số có phần thực và phần ảo được biểu diễn dưới dạng x + 2y. bool. Dữ liệu có một trong hai giá trị tích hợp Đúng hoặc Sai.

Vô hướng trong lập trình là gì?

Vô hướng nghĩa là gì? . Nó là một thành phần duy nhất giả định một loạt các giá trị số hoặc chuỗi. Một giá trị vô hướng được liên kết với mọi điểm trong không gian. a variable that holds one value at a time. It is a single component that assumes a range of number or string values. A scalar value is associated with every point in a space.

Chủ Đề