熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL 5.0新特性教程 存儲過程:第一講

2022-06-13   來源: MySQL 

  Introduction 簡介
  
  MySQL 新特性教程是為需要了解版本新特性的MySQL老用戶而寫的簡單的來說是介紹了存儲過程觸發器視圖信息架構視圖在此感謝譯者陳朋奕的努力
  
  希望這本書能像內行專家那樣與您進行對話用簡單的問題例子讓你學到需要的知識為了達到這樣的目的我會從每一個細節開始慢慢的為大家建立概念最後會給大家展示較大的實用例在學習之前也許大家會認為這個用例很難但是只要跟著課程去學相信很快就能掌握
  
  Conventions and Styles 約定和編程風格
  
  每次我想要演示實際代碼時我會對mysql客戶端的屏幕就出現的代碼進行調整將字體改成Courier使他們看起來與普通文本不一樣
  
  在這裡舉個例子mysql> DROP FUNCTION f;Query OK rows affected ( sec)
  
  如果實例比較大則需要在某些行和段落間加注釋同時我會用將<符號放在頁面的右邊以表示強調
  
  例如
  
  mysql> CREATE PROCEDURE p ()
  > BEGIN
  > /* This procedure does nothing */ <
  > END;//Query OK rows affected ( sec)
  
  有時候我會將例子中的mysql>>這些系統顯示去掉你可以直接將代碼復制到mysql客戶端程序中(如果你現在所讀的不是電子版的可以在網站下載相關腳本)所以的例子都已經在Suse LinuxMysql 公共版上測試通過
  
  在您閱讀本書的時候Mysql已經有更高的版本同時能支持更多OS了包括WindowsSparcHPUX因此這裡的例子將能正常的運行在您的電腦上但如果運行仍然出現故障可以咨詢你認識的資深Mysql用戶以得到長久的支持和幫助
  
  A Definition and an Example 定義及實例
  
  定義及實例存儲過程是一種存儲在書庫中的程序(就像正規語言裡的子程序一樣)准確的來說MySQL支持的routines(例程)有兩種一是我們說的存儲過程二是在其他SQL語句中可以返回值的函數(使用起來和Mysql預裝載的函數一樣如pi())我在本書裡面會更經常使用存儲過程因為這是我們過去的習慣相信大家也會接受
  
  一個存儲過程包括名字參數列表以及可以包括很多SQL語句的SQL語句集
  
  在這裡對局部變量異常處理循環控制和IF條件句有新的語法定義
  
  下面是一個包括存儲過程的實例聲明(譯注為了方便閱讀此後的程序不添任何中文注釋)
  
  CREATE PROCEDURE procedure /* name存儲過程名*/
  
  (IN parameter INTEGER) /* parameters參數*/
  
  BEGIN /* start of block語句塊頭*/
  
  DECLARE variable CHAR(); /* variables變量聲明*/
  
  IF parameter = THEN /* start of IF IF條件開始*/
  
  SET variable = birds; /* assignment賦值*/
  
  ELSE
  
  SET variable = beasts; /* assignment賦值*/
  
  END IF; /* end of IF IF結束*/
  
  INSERT INTO table VALUES (variable);/* statement SQL語句*/
  
  END /* end of block語句塊結束*/
  
  下面我將會介紹你可以利用存儲過程做的工作的所有細節同時我們將介紹新的數據庫對象—觸發器因為觸發器和存儲過程的關聯是必然的
  
  Why Stored Procedures 為什麼要用存儲過程
  
  由於存儲過程對於MySQL來說是新的功能很自然的在使用時你需要更加注意
  
  畢竟在此之前沒有任何人使用過也沒有很多大量的有經驗的用戶來帶你走他們走過的路然而你應該開始考慮把現有程序(可能在服務器應用程序中用戶自定義函數(UDF)中或是腳本中)轉移到存儲過程中來這樣做不需要原因你不得不去做
  
  因為存儲過程是已經被認證的技術!雖然在Mysql中它是新的但是相同功能的函數在其他DBMS中早已存在而它們的語法往是相同的因此你可以從其他人那裡獲得這些概念也有很多你可以咨詢或者雇用的經驗用戶還有許多第三方的文檔可供你閱讀
  
  存儲過程會使系統運行更快!雖然我們暫時不能在Mysql上證明這個優勢用戶得到的體驗也不一樣我們可以說的就是Mysql服務器在緩存機制上做了改進就像Preparedstatements(預處理語句)所做的那樣由於沒有編譯器因此SQL存儲過程不會像外部語言(如C)編寫的程序運行起來那麼快但是提升速度的主要方法卻在於能否降低網絡信息流量如果你需要處理的是需要檢查循環多語句但沒有用戶交互的重復性任務你就可以使用保存在服務器上的存儲過程來完成這樣在執行任務的每一步時服務器和客戶端之間就沒那麼多的信息來往了
  
  所以存儲過程是可復用的組件!想象一下如果你改變了主機的語言這對存儲過程不會產生影響因為它是數據庫邏輯而不是應用程序存儲過程是可以移植的!當你用SQL編寫存儲過程時你就知道它可以運行在Mysql支持的任何平台上不需要你額外添加運行環境包也不需要為程序在操作系統中執行設置許可或者為你的不同型號的電腦存儲過程將被保存!如果你編寫好了一個程序例如顯示銀行事物處理中的支票撤消那想要了解支票的人就可以找到你的程序
  
  它會以源代碼的形式保存在數據庫中這將使數據和處理數據的進程有意義的關聯這可能跟你在課上聽到的規劃論中說的一樣存儲過程可以遷移!
  
  Mysql完全支持SQL 標准某些數據庫(如DBMimer)同樣支持但也有部分不支持的如OracleSQL Server不支持我們將會給予足夠幫助和工具使為其他DBMS編寫的代碼能更容易轉移到Mysql上
  
  Setting up with MySQL 設置並開始MySQL 服務
  
  通過
  mysql_fix_privilege_tables
  
  或者
  ~/mysql/scripts/mysql_install_db
  
  來開始MySQL服務
  
  作為我們練習的准備工作的一部分我假定MySQL 已經安裝如果沒有數據庫管理員為你安裝好數據庫以及其他軟件你就需要自己去安裝了不過你很容易忘掉一件事那就是你需要有一個名為mysqlproc的表
  
  在安裝了最新版本後你必須運行
  
  mysql_fix_privilege_tables
  
  或者
  mysql_install_db
  
  (只需要運行其中一個就夠了)——不然存儲過程將不能工作我同時啟用在root身份後運行一個非正式的SQL腳本如下
  mysql>source/home/pgulutzan/mysql/scripts/mysql_prepare_privilege_tables_for_sql
  
  Starting the MySQL Client 啟動MySQL客戶端
  
  這是我啟動mysql客戶端的方式你也許會使用其他方式如果你使用的是二進制版本或者是Windows系統的電腦你可能會在其他子目錄下運行以下程序
  easy@phpv:~> /usr/local/mysql/bin/mysql user=root
  Welcome to the MySQL monitor Commands end with ; or \g
  Your MySQL connection id is to server version: alphadebug
  Type help; or \h for help Type \c to clear the buffer
  
  在演示中我將會展示以root身份登陸後的mysql客戶端返回的結果這樣意味著我有極大的特權
  
  Check for the Correct Version 核對版本
  
  為了確認使用的MySQL的版本是正確的我們要查詢版本我有兩種方法確認我使用的是版本
  SHOW VARIABLES LIKE version;
  
  or
  SELECT VERSION();
  
  例如
  mysql> SHOW VARIABLES LIKE version;
  +++
  | Variable_name | Value |
  +++
  | version | alphadebug |
  +++
   row in set ( sec)
  mysql> SELECT VERSION();
  ++
  | VERSION() |
  ++
  | alphadebug |
  ++
   row in set ( sec)
  
  當看見數字x 後就可以確認存儲過程能夠在這個客戶端上正常工作
  
  The Sample Database 示例數據庫
  
  現在要做的第一件事是創建一個新的數據庫然後設定為默認數據庫實現這個步驟的SQL語句如下
  CREATE DATABASE db;
  USE db;
  
  例如
  mysql> CREATE DATABASE db;
  Query OK row affected ( sec)
  mysql> USE db;
  Database changed
  
  在這裡要避免使用有重要數據的實際的數據庫然後我們創建一個簡單的工作表
  
  實現這個步驟的SQL語句如下
  mysql> CREATE DATABASE db;
  Query OK row affected ( sec)
  mysql> USE db;
  Database changed
  mysql> CREATE TABLE t (s INT);
  Query OK rows affected ( sec)
  mysql> INSERT INTO t VALUES ();
  Query OK row affected ( sec)
  
  你會發現我只在表中插入了一列這樣做的原因是我要保持表的簡單因為在這裡並不需要展示查詢數據的技巧而是教授存儲過程不需要使用大的數據表因為它本身已經夠復雜了
  
  這就是示例數據庫
From:http://tw.wingwit.com/Article/program/MySQL/201311/29341.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.