1. 程式人生 > >辛星淺析plpgsql語法(中)

辛星淺析plpgsql語法(中)

       第一,宣告

       所有在塊裡面的變數都必須在塊的宣告段裡面首先進行宣告,唯一例外的就是for迴圈裡面的迴圈計數變數,它會自動被宣告為整型。

      變數的宣告語法如下:  

       變數名    [CONSTANT]   變數型別  [NOT  NULL]  [{ DEFAULT | := } 表示式];

      對於宣告語法,需要說明的幾點是:

      ①SQL中的資料型別均可以作為plpgsql變數的資料型別,比如integer、varchara和char等等。

      ②如果給出了DEFAULT語句,則該變數在進入BEGIN塊時將會被初始化為該預設值,如果被初始化為SQL空值,則預設值則是每次進入該塊的時候進行計算的。很經典的一個例子就是如果我們把now()賦值給一個型別為timestamp型別的變數,那麼該變數的值將會被賦值為該函式實際呼叫的時候的時間,而不是函式預編譯的時候的時間。

      ③其中CONSTANT是為了避免該變數在進入BEGIN後被重新賦值,它就是保證該變數始終作為一個常量。

      ④如果我們聲明瞭NOT NULL,那麼給該變數賦予NULL值將會給該變數導致一個執行時錯誤,因此所有被宣告為NOT NULL的變數必須在宣告時定義一個非空的預設值。

       對於函式的引數我們有如下介紹:

     ①傳遞給函式的引數我們都是使用$1以及$2這樣的識別符號來表示的,但是為了增強可讀性,我們可以為其宣告一個別名,之後我們可以使用別名和數字識別符號都可以引用到該變數。

     ②其中我們還可以在宣告段中為引數變數定義別名,它的格式是: 變數名    ALIAS  FOR  $1   ,當然這裡的$1可以替換為其他的變數。

     ③對於輸出引數而言,我們遵循上面兩個規則,而且輸出引數需要在變數名前面新增一個OUT識別符號。

     ④如果plpgsql函式的返回型別為多型型別,那麼函式就會建立一個特殊的引數:$0,我們依然可以為該變數設定別名。

      對於拷貝型別,它不是一個數據型別,它是使用某個變數名的資料型別作為它的資料型別,我們可以使用格式為:   變數名%TYPE,其中%TYPE表示一個變數或者欄位的資料型別,而plpgsql允許通過該方式宣告一個變數,它的型別等同於該變數名的資料型別。

      對於行型別,我們可以使用如下的宣告方式:  變數名    表名%ROWTYPE,它表示指定表的行型別,當我們在建立一個表的時候,pgsql也會隨之創建出一個與之相應的複合型別,該型別名等同於表名。當然如果我們要訪問變數中的某個域的欄位,我們也可以使用點表示法,也就是"表名.欄位名"的方式。

         其實還有一種記錄型別,它的使用格式為:  變數名    RECORD ,對於記錄型別,它有點類似於行型別變數,但是它沒有預定義的結構,我們只能通過select或者for命令來獲取實際的行結構,因此記錄變數在被初始化之前是無法被訪問的,否則將會引起執行時錯誤。

         另外,需要說明的是,RECORD並不是一個真正的資料型別,它只是一個佔位符。

        第二,基本語句

        對於賦值語句,在pgsql中的基本形式為:  變數名 :=  表示式,等號兩邊的變數和表示式的資料型別要麼一直,要麼可以通過型別轉換得到,否則會在執行時出錯。

        我們還可以使用select  into來給記錄變數或者行型別的變數進行賦值,它的一般使用形式是:select  into  目標值   欄位   from   .....   ,注意這種賦值方式依次只能賦值給一個變數,如果我們將一行或者一個變數列表用作目標,那麼選出的數值必須精確匹配目標的結構,否則就會產生執行時錯誤。

       通常我們要測試一條記錄或者一行結果是否為空,我們可以使用is  null為條件進行判斷,但是對於返回多條記錄的情況則無法判斷。