403963 ランダム
 ホーム | 日記 | プロフィール 【ログイン】

読書と技術となんか色々のログ

PR

カレンダー

カテゴリ

2008年09月05日
XML
カテゴリ:[DB] PostgreSQL
PostgreSQL初心者の悪戦苦闘ぶりをメモする pl/pgsql篇

使用可能言語の一覧表示

>createlang -U "ユーザー名" -d "データベース名" -l
Password: "パスワード"

Procedural Languages
  Name   | Trusted?
---------+----------
 plpgsql | yes



plpgsqlのインストール

>createlang -U "ユーザー名" -d "データベース名" plpgsql
Password: "パスワード"



サンプルプログラム(sample_func.sql)

CREATE OR REPLACE FUNCTION sample_func() RETURNS timestamp AS
$$
--------------------------------------------------------
--宣言部
--------------------------------------------------------

DECLARE

    current_time timestamp;
    dummy varchar;

    x1 integer := 100;

    --カーソル定義
    product_cur cursor is
    select products.*
     from products
     order by
         products.product_no
         ;

    --カーソル変数の定義
    product_rec record;

    --行変数の定義
    products_rowtype products%rowtype;

    wn_products_no products.product_no%type;

--------------------------------------------------------
--実行部
--------------------------------------------------------

BEGIN

    RAISE NOTICE 'start : [%]', clock_timestamp();

    --ディレイ
    select pg_sleep(3) into dummy;


    --for loop
    FOR i IN 1..10 LOOP
        RAISE LOG 'for loop i = %',i;
    END LOOP;


    --cursor for loop
    FOR product_rec IN select * from products order by products.product_no LOOP
        RAISE LOG 'for loop products.product_no = % %',product_rec.product_no ,product_rec.name;
    END LOOP;


    --open cursor loop
    OPEN product_cur;
    LOOP
        FETCH product_cur into product_rec;
        IF NOT FOUND THEN
            EXIT;
        END IF;
        RAISE LOG 'open loop products.product_no = % %',product_rec.product_no ,product_rec.name;
    END LOOP;
    CLOSE product_cur;


    current_time := clock_timestamp();


    RAISE LOG 'global x1 = %',x1;

    --サブブロックの宣言
    <<sub>>
    DECLARE
        x1 integer := 200;
    BEGIN
        RAISE LOG 'local x1 = %', x1;
        RAISE LOG 'local x1 = %', sub.x1;
    END sub;


    --サブブロックでの例外キャッチ
    BEGIN
        x1 := x1 / 0;
    EXCEPTION
        WHEN division_by_zero THEN
            RAISE WARNING 'division_by_zero % %', SQLSTATE, SQLERRM;
    END;


    --動的SQL
    wn_products_no := 1;

    EXECUTE 'select products.* from products where products.product_no = ' || quote_literal(wn_products_no) INTO STRICT products_rowtype;
    IF products_rowtype IS NOT NULL THEN
        RAISE LOG 'FOUND product_no = % %',products_rowtype.product_no, products_rowtype.name;
    ELSE
        RAISE LOG 'NOT FOUND!';
    END IF;

    --ディレイ
    select pg_sleep(2) into dummy;

    RAISE NOTICE 'end : [%]', clock_timestamp();

    RETURN current_time;

--------------------------------------------------------
--例外部(オプション)
--------------------------------------------------------

EXCEPTION
    WHEN OTHERS THEN
        RAISE WARNING 'EXCEPTION! % %',SQLSTATE, SQLERRM;
        RETURN now();
    --function実行中にctrl+c等で中断させると発生
    WHEN QUERY_CANCELED THEN
        RAISE NOTICE 'FUNCTION CANCELD % %',SQLSTATE, SQLERRM;
        RETURN now();
END;
$$
LANGUAGE plpgsql;



コンパイル

=>\i sample_func.sql
CREATE FUNCTION



実行

=>select sample_func();

       sample_func
-------------------------
 2008-09-04 14:42:39.078
(1 row)



OSのコマンドプロンプトからファンクションを実行
outer.sqlというファイルを作成し、以下の内容を記述して保存する。

select sample_func();




>psql -U "ユーザー名" -d "データベース名" -f c:\outer.sql
Password for user ユーザー名: "パスワード"

      sample_func
-------------------------
 2008-09-04 14:49:30.562
(1 row)

>





第 38章PL/pgSQL - SQL手続き言語

30.13. パスワードファイル


参考にさせて頂いたページです。
cronでSQLを実行(PostgreSql)

PostgreSQL で時間の差を取って返す






最終更新日  2008年09月27日 05時00分03秒
コメント(0) | コメントを書く
[[DB] PostgreSQL] カテゴリの最新記事


Copyright (c) 1997-2017 Rakuten, Inc. All Rights Reserved.