高度 - 間違った使い方?



面白い使い方が幾つかあります。知っておくと、出来る事の幅が広がるかも知れません。



1. ユーザー変数を使う。


 [MySQLを使った例]

    1. 変数を設定します。
        set @a:=0
  
  2. 変数のデータを取得します。
        select @a
        この結果、「0」が返ります。

    3. select内で計算してみる
       select @a:=@a+1
       この結果、「1」が返ります。
   二回目に実行した場合は、「2」が返ります。
   これは、@a+1の結果を@aに代入しているからです。

     4. 別名をつける
        select @a:=@a+1 as TEST
       これにより、項目名がTESTになります。

     5. 応用するとこんなことが出来ます。
      データ1を比較しながら結果を返します。
SEQ データ1 データ2 
000001 2 9 
000002  1 10
000003  3 8
000004 4  12 
        (テーブル名: basic)

         set @a:=0
         select if( データ1 > @a , @a:=  データ1 ,@a) as 今一番大きいデータ1, データ2 from basic

SEQ 今一番大きいデータ1 データ2 
000001 2 9
000002 2 10
000003 3 8
000004 4  12 
        (返ってくるデータ)

         set @a:=0
         select if( データ1 > @a , @a:=  データ1 ,@a) as 今一番大きいデータ1, データ2
          from basic
          order by データ2

SEQ 今一番大きいデータ1 データ2 
000003 3 8
000001 3 9
000002 3 10
000004 4  12 
        (返ってくるデータ)

    データ2でソートした場合、データ2の値が(8, 9, 10, 12)の順に返ってくるため、
  今一番大きいデータ1は、(3, 3, 3, 4)になります。



  ※ この変数は、セッションが切れるまで保持されます。


2. リンクサーバー

 
 ACCESS: 
ACCESSの「テーブルのリンク」でODBCを選択すると、
         ODBC経由で他のデータベースと接続できます。
         リンク設定したテーブルは、ACCESSのテーブルの様に扱えます。

         VB ⇔ ACCESS ⇔ (MySQL、SQLServer、ORACLE、・・・)

         ※ 例えば、MySQL上の商品マスタSQLサーバー上の買い物データファイル
           をリンク設定すると、
          「SELECT F.* , M.* 
                           FROM 買い物データファイル F
                  left join 商品マスタ M on F.商品コード = M.商品コード


          のSQL文を実行できる。 

        ※ データの移行作業時によく使います。

 SQLServer(MSDE): 「sp_addlinkedserver」を使うことで、他のデータベースと接続できます。
  下の例は、コマンドプロンプトからosqlを起動させて行います。
  ※ 動く保証はありません。(前は動いていたんですが・・・)

  [対 Oracleの例] 
     sp_addlinkedserver 'OrDB' , 'Oracle' , 'MSDAORA' , 'ORACLEDB'
     sp_addlinkedsrvlogin 'OrDB' , false , 'sa' , 'SCOTT' , 'TIGER'
     SELECT * FROM OrDB..SCOTT.EMP

    [対 MySQLの例]
     sp_addlinkedserver 'mysqlDB', 'MySQL', 'MSDASQL', Null, Null, 'Driver= {MySQL ODBC 3.51 Driver}'
     SELECT * FROM OPENQUERY (mysqlDB,'SELECT * FROM MYSQL.ACCOUNT')

  [リンクサーバーの削除]
  sp_dropserver OrDB, droplogins
  
  ※ 実務で使用したことがありませんので、用途はわかりません。
    SQLサーバーのテーブルにトリガーでも仕掛けて、
    他のデータベースにも「追加・更新・削除」するとか・・・。



3. ストアド

 
 [動的なストアド Oracleの例]
 
  
ストアドプロシージャと言えば開発時に作成し、コンパイル済みであるかのようですが、
  プログラム実行時に作成する事もできます。

    '---------------------------------------------------------------------
    Set OraSession = CreateObject("OracleInProcServer.XOraSession")
    Set OraDatabase = OraSession.OpenDatabase("SNAME", "USER/PASS", 0&)

  strSql = "" '←ここにストアドのソースをセットする。
                    ' CREATE PROCEDUREの記述は書かずに、変数宣言からはじめます。

  OraDatabase.dbexecutesql( strSql )
    '---------------------------------------------------------------------

  上記のプログラムでストアドが実行されます。

  ストアドの結果を得たい場合は、パラメータを設定します。

    [簡単な例]
       Dim objSess as object
       Dim objConn as object
       Dim strSql As String
       Dim lngRet as Long
       Dim Serv As String , User As String , Pass As String , Work As String       

       Serv = ""
       User = "SYSTEM"
       Pass = "MANAGER"

       Set objSess = CreateObject("OracleInProcServer.XOraSession")
       Work = User & "/" & Pass
       Set objConn = objSess.DbOpenDatabase(Serv, Work, 0&)
   
       With objConn
         .Parameters.Add "initAllData", 0, 2
         .Parameters("initAllData").ServerType = ORATYPE_CHAR

         strSql = ""
         strSql = strSql & " DECLARE initAllData CHAR(40);"
         strSql = strSql & " BEGIN"
         strSql = strSql & "   :initAllData := 'TAKO8';"
         strSql = strSql & " END;"

         lngRet = .dbexecutesql(strSql)
  
         Debug.Print .Parameters("initAllData").Value
      End With

      この結果、「TAKO8」が表示されます。


  

TOP

(c)2006 はじめたばかりのデータベース rAreSoft All Rights Reserved.