sql >> データベース >  >> RDS >> Mysql

F#初心者:サーバーからデータの配列を取得する

    Seqタイプには、generate_usingと呼ばれるデータベースカーソルを処理するための優れた関数があります( F#マニュアル F#の基礎 のデータアクセスの章 )。これは、カーソルを開くために1つの関数を取り、カーソルからのレコードを処理するために別の関数(繰り返し呼び出される)をとる高階関数です。これは、generate_usingを使用してSQLクエリを実行するコードです。

    let openConnection (connectionName : string) =
        let connectionSetting = ConfigurationManager.ConnectionStrings.Item(connectionName)
        let connectionString = connectionSetting.ConnectionString
        let connection = new OracleConnection(connectionString)
        connection.Open()
        connection
    
    let generator<'a> (reader : IDataReader) =
        if reader.Read() then
            let t = typeof<'a>
            let props = t.GetProperties()
            let types = props
                        |> Seq.map (fun x -> x.PropertyType)
                        |> Seq.to_array
            let cstr = t.GetConstructor(types)
            let values = Array.create reader.FieldCount (new obj())
            reader.GetValues(values) |> ignore
            let values = values
                         |> Array.map (fun x -> match x with | :? DBNull -> null | _ -> x)
            Some (cstr.Invoke(values) :?> 'a)
        else
            None
    
    let executeSqlReader<'a> (connectionName : string) (sql : string) : 'a list =        
        let connection = openConnection connectionName
    
        let opener() = 
            let command = connection.CreateCommand(CommandText = sql, CommandType = CommandType.Text)
            command.ExecuteReader()
    
        let result = Seq.to_list(Seq.generate_using opener generator)        
    
        connection.Close()
        connection.Dispose()
        result
    

    たとえば、Oracleデータベース内のすべてのテーブルを一覧表示するには、列定義タイプを定義し、次のようにexecuteSqlReaderを呼び出す必要があります。

    type ColumnDefinition = {
        TableName : string;
        ColumnName : string;
        DataType : string;
        DataLength : decimal;                
    }
    
    let tableList = executeSqlReader<ColumnDefinition>
        "MyDatabase"
        "SELECT t.table_name, column_name, data_type, data_length FROM USER_TABLES t, USER_TAB_COLUMNS c where t.TABLE_NAME = c.table_name order by t.table_name, c.COLUMN_NAME"
    


    1. SQLピボット–行を列に変換する方法を知っている

    2. MySQLのテーブルから列を削除する方法

    3. PostgreSQLでJSONB値をマージしますか?

    4. (英語)Oracle Database 19c Pre-BuiltDeveloperVMの使用方法