<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    HelloWorld 善戰(zhàn)者,求之于勢,不責于人;故能擇人而任勢。

    知止而后有定,定而后能靜,靜而后能安,安而后能慮,慮而后能得。物有本末,事有終始。知所先后,則近道矣。

      BlogJava :: 首頁 ::  :: 聯(lián)系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 40 評論 :: 0 Trackbacks

    http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html
    創(chuàng)建plpgsql語言
    create language plpgsql;

    例子一

    CREATE OR REPLACE FUNCTION instr(character varying, integer)
                   RETURNS integer AS
    $BODY$
    declare
    str alias for $1;
    ind alias for $2;
    begin
    return ind+100;
    end;
    $BODY$
                   LANGUAGE 'plpgsql' VOLATILE;
    > select instr('aaa',100) ;
    > 200

    例子二
    如果一個 PL/pgSQL 函數(shù)的返回類型聲明為一個多態(tài)類型 (anyelement 或者 anyarray),那么就會創(chuàng)建一個特殊的參數(shù), $0。它的數(shù)據(jù)類型是函數(shù)的實際返回類型,和從實際輸入類型推導推導類型一樣 (參閱 Section 31.2.5)。 這樣就允許函數(shù)訪問它的實際返回類型,像 Section 35.4.2 里顯示的那樣。 $0 初始化為空,并且可以被函數(shù)修改,所以,如果需要,它可以用于保存返回值, 雖然這并非必須的。$0 還可以給予一個別名。比如,這個函數(shù)可以在任何有 + 操作符的數(shù)據(jù)類型上運轉(zhuǎn):
    create or replace function addT (v1 anyelement, v2 anyelement, v3 anyelement)
    returns anyelement as $$
    declare
    res alias for $0;
    begin
    res := v1+v2+v3;
    return res;
    end;
    $$language plpgsql;
    > select addT(100,200,300)
    > 600

    例子三
    variable%TYPE

    %TYPE 提供一個變量或者表字段的數(shù)據(jù)類型。 你可以用這個聲明將要保存數(shù)據(jù)庫數(shù)值的變量。比如,假如你在 users 表里面有一個字段叫 user_id。要聲明一個和 users.user_id 類型相同的變量,你可以寫:

    user_id users.user_id%TYPE;

     

    通過使用 %TYPE,你必須知道你引用的結(jié)構(gòu)的數(shù)據(jù)類型, 并且,最重要的是,如果被引用項的數(shù)據(jù)類型在將來變化了(比如:你把 user_id 的類型從 integer 改成 real),你也不需要修改你的函數(shù)定義。

    %TYPE 對多態(tài)的函數(shù)特別有用,因為內(nèi)部變量的數(shù)據(jù)類型可能在不同調(diào)用中是不一樣的。 我們可以通過給函數(shù)的參數(shù)或者結(jié)果占位符附加 %TYPE 的方法來創(chuàng)建合適的變量。

    例子四

    行類型
    name table_name%ROWTYPE;
    name composite_type_name;

     

    一個復合類型變量叫做變量(或者row-type變量)。 這樣的一個變量可以保存一次SELECT或者 FOR命令結(jié)果的完整一行,只要命令的字段集匹配該變量聲明的類型。 行數(shù)值的獨立的字段是使用常用的點表示法訪問的,比如 rowvar.field

    一個行變量可以聲明為和一個現(xiàn)有的表或者視圖的行類型相同,方法是使用 table_name%ROWTYPE 表示法; 或者你也可以聲明它的類型是一個復合類型的名字。(因為每個表都有一個相關聯(lián)的同名數(shù)據(jù)類型, 在 PostgreSQL 里實在是無所謂你寫不寫 %ROWTYPE。但是有 %ROWTYPE 的形式移植性更好。)

    函數(shù)的參數(shù)可以是復合類型(表的完整行)。這個時候, 對應的標識符 $n 將是一個行變量,并且可以從中選取字段,比如 $1.user_id

    在一個行類型的變量中,只可以訪問用戶定義的表中行的屬性, 不包括 OID 或者其他系統(tǒng)屬性(因為該行可能來自一個視圖)。 該行類型的數(shù)據(jù)域繼承表中象 char(n) 這種類型字段的尺寸和精度。

    這里是一個使用復合類型的例子:
    CREATE TABLE tbl_store1
    (
               store_no integer NOT NULL DEFAULT nextval('tbl_store1_sq'::regclass),
               parent_id integer,
               "type" integer,
               "values" real,
               CONSTRAINT tbl_store1_pkey PRIMARY KEY (store_no)
    )
    插入植 1 1 1 1;

    CREATE OR REPLACE FUNCTION merge(t_row tbl_store1)
               RETURNS text AS
    $BODY$
    declare
    t2_row tbl_store1%rowtype;
    begin
    select * into t2_row from tbl_store1 ;
    return t_row.values || t2_row.values;
    end;
    $BODY$
               LANGUAGE 'plpgsql' VOLATILE;
    > select merge(t.*) from tbl_store1 t ;
    > 11

    例子五
    /**
    create or replace function logfun1(log text) returns timestamp as $$
    begin
    insert into tbl_store1 values(3,1,1,1,'now');
    return 'now';
    end;
    $$ language plpgsql;
    select logfun1('test');
    **/
    create or replace function logfun2(log text) returns timestamp as $$
    declare
    ctime timestamp;
    begin
    ctime :='now';
    insert into tbl_store1 values(6,2,1,1,ctime);
    return ctime;
    end;
    $$ language plpgsql;
    select logfun2('aaa');

    logfunc1() 的實例里, PostgreSQL 的主分析器在為 INSERT 準備執(zhí)行計劃的時候知道字串 'now' 應該解釋成 timestamp 類型,因為 logtable 的目標字段就是該類型。所以,它會在這個時候從這個字串中計算一個常量, 然后在該服務器的整個生存期中的所有 logfunc1 調(diào)用中使用這個常量。不消說,這可不是程序員想要的。

    logfunc2里, PostgreSQL 的主分析器并不知道 now 應該轉(zhuǎn)換成什么類型, 因此它返回一個包含字符串 now 的類型為 text 的數(shù)據(jù)值。 在隨后給局部變量curtime賦值時, PL/pgSQL解釋器通過調(diào)用 text_outtimestamp_in 把這個字符串轉(zhuǎn)換成 timestamp 類型的變量。 因此,計算出的時戳就會按照程序員希望的那樣在每次執(zhí)行的時候都更新。

    記錄變量的易變性天性在這種結(jié)合上提出了一個問題。 在一個記錄變量在語句或者表達式中使用時, 該字段的數(shù)據(jù)類型在同一個表達式的不同調(diào)用期間不能修改, 因為該表達式準備使用的是運行第一次到達該表達式時出現(xiàn)的數(shù)據(jù)類型。 在寫處理超過一個表的事件的觸發(fā)器過程的時候一定要把這個記住。(必要時可以用EXECUTE繞開這個問題。)

    例子六
    create or replace function tSInto () returns varchar as
    $$
    declare rec record;
    begin
    select into rec * from tbl_store1 where values =1;
    if not found then
    return 'test';
    else
    return 'tttt';
    end if;
    end;
    $$
    language plpgsql;
    select tSInto();

    create or replace function tSInto () returns varchar as
    $$
    declare rec record;
    begin
    select into rec * from tbl_store1 where values =1;
    if rec.values isNULL then
    return 'okkkkkkk';
    else return 'test';
    end if ;
    end;
    $$
    language plpgsql;
    select tSInto();
    例子七
    create or replace function cur1 () returns text as
    $$
    declare
    curs1 CURSOR for select * from tbl_store1;
    res text :='';
    a varchar;
    b varchar;
    c varchar;
    d varchar;
    e varchar;
    begin
    OPEN curs1;
    loop
    fetch curs1 into a,b,c,d,e;
    if not found then
    return 'error';
    exit;
    end if;
    res = 'test'||res;
    end loop;
    close curs1;
    return res;
    end;
    $$
    language plpgsql;

    CREATE OR REPLACE FUNCTION cur1()
        RETURNS text AS
    $BODY$
    declare
    curs1 CURSOR for select * from tbl_store1;
    res text :='';
    a varchar;
    b varchar;
    c varchar;
    d varchar;
    e varchar;
    begin
    OPEN curs1;
    loop
    fetch curs1 into a,b,c,d,e;
    if (found) then
    if (a is null) then
        a = '';
    end if ;
    if (b is null) then
        b = '';
    end if ;
    if (c is null) then
        c = '';
    end if ;
    if (d is null) then
        d = '';
    end if ;
    if (e is null) then
        e = '';
    end if ;
        res = res || a || b || c || d || e;
    else
    exit;
    end if;
    end loop;
    close curs1;
    return res;
    end;
    $BODY$
        LANGUAGE 'plpgsql' VOLATILE;
    select cur1();



    </script>

    posted on 2007-08-13 18:59 helloworld2008 閱讀(420) 評論(0)  編輯  收藏 所屬分類: SQL
    主站蜘蛛池模板: 亚洲综合另类小说色区| 日本三级在线观看免费| 亚洲精品影院久久久久久| jizzjizz亚洲| a毛片基地免费全部视频| 人妻免费一区二区三区最新| jzzijzzij在线观看亚洲熟妇| 亚洲不卡视频在线观看| 亚洲AV日韩AV永久无码绿巨人 | 亚洲日韩国产精品第一页一区| 午夜电影免费观看| 国产91色综合久久免费| 国产午夜无码精品免费看动漫| 一边摸一边桶一边脱免费视频| 亚洲日韩精品无码专区加勒比☆| 91亚洲一区二区在线观看不卡| 国精无码欧精品亚洲一区| 亚洲一级特黄大片在线观看| 国产美女无遮挡免费网站| 国内外成人免费视频| 国产三级在线观看免费| 免费在线观看h片| 97国产免费全部免费观看| 99精品视频免费在线观看| 特级精品毛片免费观看| 国产成人AV片无码免费| 免费观看91视频| 午夜免费福利视频| 免费无码成人AV在线播放不卡| 免费网站看av片| 8x成人永久免费视频| 777成影片免费观看| 69天堂人成无码麻豆免费视频| 免费专区丝袜脚调教视频| 永久免费的网站在线观看| 黄色成人网站免费无码av| 成年免费大片黄在线观看岛国 | 亚洲国产成人综合| 久久精品国产亚洲av麻豆蜜芽| 亚洲欧洲日韩极速播放| 亚洲国产无线乱码在线观看 |