{"id":1913,"date":"2025-02-15T10:27:40","date_gmt":"2025-02-15T15:27:40","guid":{"rendered":"https:\/\/molecularsciences.org\/content\/?p=1913"},"modified":"2025-02-13T10:29:21","modified_gmt":"2025-02-13T15:29:21","slug":"pl-sql-data-types","status":"publish","type":"post","link":"https:\/\/molecularsciences.org\/content\/pl-sql-data-types\/","title":{"rendered":"PL\/SQL Data Types"},"content":{"rendered":"\n<p>Data types define the kind of data that can be stored and manipulated in a PL\/SQL program. Oracle PL\/SQL provides a wide range of data types, categorized into <strong>scalar<\/strong>, <strong>composite<\/strong>, <strong>reference<\/strong>, and <strong>LOB (Large Object)<\/strong> data types. Understanding these data types is crucial for writing efficient and optimized PL\/SQL code.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Scalar Data Types<\/strong><\/h2>\n\n\n\n<p>Scalar data types hold a <strong>single<\/strong> value and do not have internal components. These are the most basic data types in PL\/SQL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Common Scalar Data Types<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Data Type<\/th><th>Description<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>VARCHAR2(size)<\/code><\/td><td>Variable-length character string (1 to 32,767 bytes)<\/td><td><code>VARCHAR2(50)<\/code><\/td><\/tr><tr><td><code>CHAR(size)<\/code><\/td><td>Fixed-length character string (1 to 32,767 bytes)<\/td><td><code>CHAR(10)<\/code><\/td><\/tr><tr><td><code>NUMBER(p,s)<\/code><\/td><td>Numeric value (p = precision, s = scale)<\/td><td><code>NUMBER(10,2)<\/code><\/td><\/tr><tr><td><code>BOOLEAN<\/code><\/td><td>Stores <code>TRUE<\/code>, <code>FALSE<\/code>, or <code>NULL<\/code> (Only in PL\/SQL, not in SQL)<\/td><td><code>BOOLEAN<\/code><\/td><\/tr><tr><td><code>DATE<\/code><\/td><td>Stores date and time (YYYY-MM-DD HH:MI:SS)<\/td><td><code>DATE<\/code><\/td><\/tr><tr><td><code>TIMESTAMP<\/code><\/td><td>Stores date and time with fractional seconds<\/td><td><code>TIMESTAMP<\/code><\/td><\/tr><tr><td><code>BINARY_INTEGER<\/code><\/td><td>Integer value optimized for performance<\/td><td><code>BINARY_INTEGER<\/code><\/td><\/tr><tr><td><code>PLS_INTEGER<\/code><\/td><td>Similar to <code>BINARY_INTEGER<\/code> but faster<\/td><td><code>PLS_INTEGER<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Example of Scalar Data Type Usage<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    v_name VARCHAR2(50);<br>    v_age NUMBER(3);<br>    v_is_active BOOLEAN;<br>    v_join_date DATE;<br>BEGIN<br>    v_name := 'John Doe';<br>    v_age := 30;<br>    v_is_active := TRUE;<br>    v_join_date := SYSDATE;<br>    <br>    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);<br>    DBMS_OUTPUT.PUT_LINE('Age: ' || v_age);<br>    DBMS_OUTPUT.PUT_LINE('Joining Date: ' || v_join_date);<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Composite Data Types<\/strong><\/h2>\n\n\n\n<p>Composite data types can hold <strong>multiple<\/strong> values, making them useful for storing complex structures. These include <strong>RECORDS<\/strong>, <strong>PL\/SQL TABLES<\/strong>, <strong>VARRAYs<\/strong>, and <strong>NESTED TABLES<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.1 RECORD Data Type<\/strong><\/h3>\n\n\n\n<p>A <code>RECORD<\/code> is similar to a <strong>struct<\/strong> in C or <strong>object<\/strong> in other languages, containing multiple fields of different types.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Example of RECORD Usage<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    TYPE emp_record IS RECORD (<br>        emp_id NUMBER(5),<br>        emp_name VARCHAR2(50),<br>        salary NUMBER(10,2)<br>    );<br>    v_emp emp_record;<br>BEGIN<br>    v_emp.emp_id := 101;<br>    v_emp.emp_name := 'Alice';<br>    v_emp.salary := 5000;<br><br>    DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp.emp_id);<br>    DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp.emp_name);<br>    DBMS_OUTPUT.PUT_LINE('Salary: ' || v_emp.salary);<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.2 PL\/SQL TABLE (Associative Array)<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A one-dimensional, sparse collection indexed by either <strong>BINARY_INTEGER<\/strong> or <strong>VARCHAR2<\/strong>.<\/li>\n\n\n\n<li>Useful for in-memory data storage.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Example of PL\/SQL Table<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    TYPE emp_table IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;<br>    v_employees emp_table;<br>BEGIN<br>    v_employees(1) := 'John';<br>    v_employees(2) := 'Alice';<br>    <br>    DBMS_OUTPUT.PUT_LINE('Employee 1: ' || v_employees(1));<br>    DBMS_OUTPUT.PUT_LINE('Employee 2: ' || v_employees(2));<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.3 VARRAY (Variable-Size Array)<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <strong>fixed-size<\/strong> collection of elements of the same type.<\/li>\n\n\n\n<li>Requires a size limit at declaration.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Example of VARRAY Usage<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    TYPE arr_names IS VARRAY(3) OF VARCHAR2(50);<br>    v_names arr_names := arr_names('John', 'Alice', 'Bob');<br>BEGIN<br>    FOR i IN 1..v_names.COUNT LOOP<br>        DBMS_OUTPUT.PUT_LINE('Name: ' || v_names(i));<br>    END LOOP;<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.4 NESTED TABLE<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Similar to a VARRAY but <strong>does not have a predefined limit<\/strong> and supports <strong>DML operations<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Example of Nested Table Usage<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    TYPE emp_nested IS TABLE OF VARCHAR2(50);<br>    v_emps emp_nested := emp_nested('John', 'Alice', 'Bob');<br>BEGIN<br>    v_emps.EXTEND;<br>    v_emps(4) := 'Charlie';<br><br>    FOR i IN 1..v_emps.COUNT LOOP<br>        DBMS_OUTPUT.PUT_LINE('Employee: ' || v_emps(i));<br>    END LOOP;<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Reference Data Types (REF CURSOR)<\/strong><\/h2>\n\n\n\n<p>A <code>REF CURSOR<\/code> is a <strong>pointer to a result set<\/strong>, allowing dynamic SQL queries. It is useful for returning query results to applications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Example of REF CURSOR<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    TYPE emp_cursor IS REF CURSOR;<br>    v_cursor emp_cursor;<br>    v_name employees.first_name%TYPE;<br>BEGIN<br>    OPEN v_cursor FOR SELECT first_name FROM employees WHERE department_id = 10;<br>    FETCH v_cursor INTO v_name;<br><br>    WHILE v_cursor%FOUND LOOP<br>        DBMS_OUTPUT.PUT_LINE('Employee: ' || v_name);<br>        FETCH v_cursor INTO v_name;<br>    END LOOP;<br>    <br>    CLOSE v_cursor;<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. LOB (Large Object) Data Types<\/strong><\/h2>\n\n\n\n<p>LOB types store <strong>large amounts of data<\/strong>, such as images, documents, and multimedia files.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>LOB Data Types<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Data Type<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>BLOB<\/code><\/td><td>Stores binary large objects (e.g., images, audio, video)<\/td><\/tr><tr><td><code>CLOB<\/code><\/td><td>Stores large character data (e.g., documents, XML)<\/td><\/tr><tr><td><code>NCLOB<\/code><\/td><td>Stores Unicode character data<\/td><\/tr><tr><td><code>BFILE<\/code><\/td><td>Stores a file reference to external OS files<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Example of Using CLOB<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>DECLARE<br>    v_large_text CLOB;<br>BEGIN<br>    v_large_text := 'This is a long text stored in a CLOB column.';<br>    DBMS_OUTPUT.PUT_LINE(v_large_text);<br>END;<br>\/<br><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>PL\/SQL provides a <strong>rich set of data types<\/strong> to handle different data storage and processing requirements:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scalar types<\/strong> store single values (e.g., <code>VARCHAR2<\/code>, <code>NUMBER<\/code>, <code>BOOLEAN<\/code>).<\/li>\n\n\n\n<li><strong>Composite types<\/strong> store multiple values in structured formats (<code>RECORD<\/code>, <code>VARRAY<\/code>, <code>NESTED TABLE<\/code>).<\/li>\n\n\n\n<li><strong>Reference types<\/strong> (<code>REF CURSOR<\/code>) allow dynamic queries.<\/li>\n\n\n\n<li><strong>LOB types<\/strong> handle large binary and character data (<code>BLOB<\/code>, <code>CLOB<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>Choosing the right data type is <strong>crucial<\/strong> for performance optimization and efficient database operations.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Data types define the kind of data that can be stored and manipulated in a PL\/SQL program. Oracle PL\/SQL provides a wide range of data types, categorized into scalar, composite, reference, and LOB (Large Object) data types. Understanding these data types is crucial for writing efficient and optimized PL\/SQL code. 1. Scalar Data Types Scalar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[515],"tags":[529],"class_list":["post-1913","post","type-post","status-publish","format-standard","hentry","category-oracle","tag-pl-sql"],"_links":{"self":[{"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/posts\/1913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/comments?post=1913"}],"version-history":[{"count":1,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/posts\/1913\/revisions"}],"predecessor-version":[{"id":1914,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/posts\/1913\/revisions\/1914"}],"wp:attachment":[{"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/media?parent=1913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/categories?post=1913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/molecularsciences.org\/content\/wp-json\/wp\/v2\/tags?post=1913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}