ストアドプロシージャに関する問題

ストアドプロシージャ(特定の機能を設定するためのSQL文)

  最初の呼び出しの後にコンパイルされたデータベースに格納された関数の特定のセットを、達成するためにSQL文のセットを再度コンパイルする必要がない(パラメータを持つストアドプロシージャが場合)を実行する、ストアドプロシージャのパラメータで指定されたユーザ名が与えられていますそれは。データベースのストアドプロシージャは重要な課題です。

1.ストアドプロシージャを作成します。

  手順ストアドプロシージャ名([ストアドプロシージャのパラメータリスト])[プロセス特性が格納されている] SQLコード内容を作成します

1例:デリミタ   // 
2が         作成 プロシージャ PROCを()
 3が         始まる
4          セレクト *を からユーザー情報。
5          // 
6        デリミタ。

2.ストレージ機能を作成します。

  関数名格納された関数を作成する([ストアドプロシージャのパラメータリスト])は、タイプ[記憶機能特性] SQLコードの内容を返します

1例:デリミタ// 
2が         作成 機能NameByZip()
 3          返す CHAR50 4          リターンセレクトからユーザー情報ここ userage = ' 23 ' );
5        // 
6        デリミタ。

変数の3.

  1)変数の定義は:ローカル変数名、データ型... [既定値]を宣言します。

    例:DECLARE MYPARAM int型デフォルト100;

  2)変数の割り当ては:設定されたローカル変数名= exprの、VAR_NAME = exprの、...;

    例:宣言VAR1、VAR2 int型。

      = 10組VAR1、VAR2 = 10。

4.定義した条件と治療手順

  1)の条件を定義します。SQLSTATE「XXXX」の宣言条件名条件。

          xxxxのための条件名条件を宣言します。

  2)カスタムハンドラ:キャプチャsqlstate_value:delcareは 'no_such_table' =インフォ@ SQLSTATE 'XXXX' のセットのハンドラを続けます。

            捕获mysql_error_code:宣言は=「no_such_table」インフォ@ XXXXセットのハンドラを続けます。

5.カーソルを使用

  1)宣言カーソル:SQL文の宣言カーソル名カーソル。

  2)カーソルを開く:オープンカーソル名を、

  3)カーソルを使用します。フィールド名にカーソル名を取得、...;

  4)カーソルをクローズします:閉じるカーソル名を、

6.コントロール・フロー計算書

  语句場合: valがnullの場合、「valがnullである」を選択します。  

      他に「valがNULLでない」を選択します。  

      場合は終了。

  case文:ケースヴァル

        とき1し、「Valで1」を選択します。

        とき2その後、「Valで2」を選択します。

        他に「valは1または2ではありません」を選択します。

       エンドケース。

  ループ语句:宣言のid int型のデフォルト0;

       add_loop:ループ。

       セットID = ID + 1。  

        ID> = 10は、add_loopを残す場合、

        場合は終了。

       エンドループadd_loop。

  leave语句:退出循环语句

  iterate语句:重新执行循环

  repeat语句:declare id int default 0;

        repeat

        set id = id + 1;

        until id >= 10;  ##先执行后判断

        end repeat;

  while语句:declare id int default 0;

       while id >=10 do  ##先判断后执行

       set id = id+1;

       end while;

7.调用存储过程和调用存储函数

  call 存储过程名称(存储过程定义的参数)

  select 存储函数名称(存储过程定义的参数)

8.查看存储过程和函数

  show {procedure | function} status like 'x%' 语句查看存储过程和函数的状态

  show create {procedure | function} 存储函数名称 语句查看存储过程和函数的定义

9.修改存储过程和函数

  alter {procedure | function}存储函数名称 (存储过程特性)

10.删除存储过程和函数

  drop {procedure | function} [if exists] 存储函数名称

存储过程优缺点:

  优点:

    1)存储过程因为SQL语句已经预编译过了,因此运行的速度比较快;

    2)存储过程在服务器端运行,减少了客户端的压力。

    3)允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用;

    4)减少网络流量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多;

    5)增强了使用的安全性,充分利用系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。程序员直接调用存储过程根本不知道表结构是什么,有什么字段,没有直接暴露表名以及字段名给程序员。

  缺点:

    调试麻烦(至少没有像开发程序那样容易),可移植性不灵活(因为存储过程是依赖于具体的数据库)。

存储过程优化思路:

  1)尽量利用一些SQL语句来代替一些小循环,例如聚合函数、求平均函数等。

  2)中间结果存放于临时表,加索引;

  3)少使用游标。SQL是一个集合语言,对于集合运算具有较高的性能。而cursors是过程运算,比如对一个100万行数据进行查询,游标需要读表100万次,而不是使用游标则只需要少量几次读取。

  4)事务越短越好,SQL server支持并发操作,如果事务过多过长或隔离级别过高,都会造成并发阻塞、死锁。导致查询极慢,CPU占用率极低。

  5)使用try...catch处理异常;

  6)查询语句尽量不要放在循环内;

 

おすすめ

転載: www.cnblogs.com/HuiH/p/11966022.html