3. PL/SQL變數

           變數是一個給定的區域,程式可以操空的名稱。PL/SQL每個變數具有一個特定的資料類型,它決定了大小和變數的存儲器的值,可以說儲存器和設定的操作可以加注到可變內被儲存的範圍內。
一個PL/SQL變數的名稱由一個字母後面可以跟多個字母,數字,美元符號,下底線和數字符號,並不得超過30個字符。預設情況下,變數名是不區分大小寫。不能使用PL/SQL保留關鍵字作為變數名稱。
PL/SQL程式語言允許定義各種類型的變數,如,日期時間,記錄,集合等資料類型將在本章後面的章節涉及,這裡只討論基本變數類型。

PL/SQL變數宣告
PL/SQL變數必須在宣告部分作為一個全局變數宣告。當宣告一個變數,PL/SQL的變數值分配記憶底並由變數名稱標識存儲位置。
宣告一個變數的語法是:
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]
其中,變數名是在PL/SQL一個有效的標識符,資料類型必須是有效PL/SQL資料類型,或者在上一章中討論的任何用戶定義的資料類型。它們的定義一些有效變數宣告如下:
sales number(10, 2);
pi CONSTANT double precision := 3.1415;
name varchar2(25);
address varchar2(100);
當提供一個大小,縮放或精度限製的資料類型,它被稱為約束宣告。受限宣告要比不受約束的宣告更少的內存。例如:
sales number(10, 2);
name varchar2(25);
address varchar2(100);

PL/SQL中初始化變數
當宣告一個變數,PL/SQL賦予默認設置為NULL值。如果想初始化NULL值以外的變數,可以宣告中這樣做,使用以下兩種的:
·       使用 DEFAULT 關鍵字
·       使用 assignment 操作符
例如:
counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';
還可以指定一個變數不應該使用NOT NULL約束NULL值。如果使用NOT NULL約束,必須明確指定該變數的初始值。
這是一個良好的編程習慣適當初始化變數,否則,有時程序會產生意想不到的結果。試試下面的例子中使用各類變數:
DECLARE
   a integer := 10;
   b integer := 20;
   c integer;
   f real;
BEGIN
   c := a + b;
   dbms_output.put_line('Value of c: ' || c);
   f := 70.0/3.0;
   dbms_output.put_line('Value of f: ' || f);
END;
/
當執行上面的程式碼,產生以下結果:
Value of c: 30
Value of f: 23.333333333333333333

PL/SQL procedure successfully completed.

PL/SQL變數的作用
PL/SQL塊允許嵌套,即,每個程序塊可以包括另一內部塊。如果變數的內部塊內宣告,它不能存取外部區塊。但是,如果一個變數宣告並訪問外部區塊,也提供給所有嵌套內部區塊。有兩種類型的變數範圍:
·       局部變數 - 在內部區塊中宣告,並不能存取外塊中的變數。
·       全局變數 - 在最外層塊或包中宣告的變數。
下面的例子顯示在簡單的局部和全局變數的用法
DECLARE
   -- Global variables
   num1 number := 95;
   num2 number := 85;
BEGIN
   dbms_output.put_line('Outer Variable num1: ' || num1);
   dbms_output.put_line('Outer Variable num2: ' || num2);
   DECLARE
      -- Local variables
      num1 number := 195;
      num2 number := 185;
   BEGIN
      dbms_output.put_line('Inner Variable num1: ' || num1);
      dbms_output.put_line('Inner Variable num2: ' || num2);
   END;
END;
/
產生以下結果:
Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185

PL/SQL procedure successfully completed.

指定SQL查詢結果為PL/SQL
可以使用SELECT INTO SQL語句來給PL/SQL變數賦值。在SELECT列表中的每個項目,必須有在INTO列表中相對應,類型兼容的變數。下面的例子說明了這個概念:現在創建一個表名為CUSTOMERS
CREATE TABLE CUSTOMERS(
   ID   INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY   DECIMAL (18, 2),      
   PRIMARY KEY (ID)
);

Table Created

接下來,就讓我們在table中新增一些值
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );

下面的程序是從上面的Table中,使用SQLSELECT INTO子句給PL/SQL變數值:
DECLARE
   c_id customers.id%type := 1;
   c_name  customers.name%type;
   c_addr customers.address%type;
   c_sal  customers.salary%type;
BEGIN
   SELECT name, address, salary INTO c_name, c_addr, c_sal
   FROM customers
   WHERE id = c_id;

   dbms_output.put_line
   ('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/
產生以下結果:

Customer Ramesh from Ahmedabad earns 2000

PL/SQL procedure completed successfully

沒有留言:

張貼留言