diff --git a/rds-data.cabal b/rds-data.cabal
--- a/rds-data.cabal
+++ b/rds-data.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.6
 
 name:                   rds-data
-version:                0.1.1.0
+version:                0.1.1.1
 synopsis:               Codecs for use with AWS rds-data
 description:            Codecs for use with AWS rds-data.
 category:               Data
@@ -118,12 +118,14 @@
                         Data.RdsData.Aws
                         Data.RdsData.Decode.Array
                         Data.RdsData.Decode.Row
+                        Data.RdsData.Decode.ToRows
                         Data.RdsData.Decode.Value
                         Data.RdsData.Default
                         Data.RdsData.Encode.Array
                         Data.RdsData.Encode.Param
                         Data.RdsData.Encode.Params
                         Data.RdsData.Encode.Row
+                        Data.RdsData.Encode.ToSqlParameters
                         Data.RdsData.Encode.Value
                         Data.RdsData.Internal.Aeson
                         Data.RdsData.Internal.Convert
@@ -133,6 +135,7 @@
                         Data.RdsData.Orphans
                         Data.RdsData.Types
                         Data.RdsData.Types.Array
+                        Data.RdsData.Types.EncodedParams
                         Data.RdsData.Types.Param
                         Data.RdsData.Types.Value
   other-modules:        Paths_rds_data
diff --git a/src/Data/RdsData/Decode/Row.hs b/src/Data/RdsData/Decode/Row.hs
--- a/src/Data/RdsData/Decode/Row.hs
+++ b/src/Data/RdsData/Decode/Row.hs
@@ -5,6 +5,7 @@
 
 module Data.RdsData.Decode.Row
   ( DecodeRow(..)
+  , ToRows(..)
   , integer
   , int
   , int8
@@ -55,6 +56,7 @@
 
 import qualified Data.Aeson                    as J
 import qualified Data.ByteString.Lazy          as LBS
+import           Data.RdsData.Decode.ToRows
 import qualified Data.RdsData.Decode.Value     as DV
 import qualified Data.RdsData.Internal.Convert as CONV
 import qualified Data.Text                     as T
@@ -62,7 +64,7 @@
 import qualified Data.UUID                     as UUID
 
 newtype DecodeRow a = DecodeRow
-  { unDecodeRow :: ExceptT Text (StateT [Value] Identity) a
+  { run :: ExceptT Text (StateT [Value] Identity) a
   }
   deriving (Applicative, Functor, Monad, MonadState [Value], MonadError Text)
 
@@ -225,7 +227,7 @@
   void $ column DV.rdsValue
 
 decodeRow :: DecodeRow a -> [Value] -> Either Text a
-decodeRow r = evalState (runExceptT r.unDecodeRow)
+decodeRow r = evalState (runExceptT r.run)
 
-decodeRows :: DecodeRow a ->  [[Value]] -> Either Text [a]
-decodeRows r = traverse (decodeRow r)
+decodeRows :: ToRows res => DecodeRow a -> res -> Either Text [a]
+decodeRows r = traverse (decodeRow r) . toRows
diff --git a/src/Data/RdsData/Decode/ToRows.hs b/src/Data/RdsData/Decode/ToRows.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/RdsData/Decode/ToRows.hs
@@ -0,0 +1,19 @@
+module Data.RdsData.Decode.ToRows
+  ( ToRows(..)
+  ) where
+
+import qualified Amazonka.RDSData          as AWS
+import           Data.Generics.Product.Any
+import           Data.Maybe
+import           Data.RdsData.Types
+import           Lens.Micro                ((^.))
+
+class ToRows a where
+    toRows :: a -> [[Value]]
+
+instance ToRows [[Value]] where
+    toRows = id
+
+instance ToRows AWS.ExecuteStatementResponse where
+    toRows res =
+        fromMaybe [] $ mapM (mapM fromField) =<< res ^. the @"records"
diff --git a/src/Data/RdsData/Encode/Params.hs b/src/Data/RdsData/Encode/Params.hs
--- a/src/Data/RdsData/Encode/Params.hs
+++ b/src/Data/RdsData/Encode/Params.hs
@@ -50,6 +50,7 @@
 import           Data.Int
 import           Data.RdsData.Encode.Array            (EncodeArray (..))
 import           Data.RdsData.Encode.Param            (EncodeParam (..))
+import           Data.RdsData.Types.EncodedParams
 import           Data.RdsData.Types.Param
 import           Data.Text                            (Text)
 import           Data.Time
@@ -65,18 +66,6 @@
 import qualified Data.RdsData.Encode.Param            as EP
 import qualified Data.Text.Lazy                       as LT
 import qualified Prelude                              as P
-
-newtype EncodedParams = EncodedParams
-  { run :: [Param] -> [Param]
-  }
-
-instance Semigroup EncodedParams where
-  EncodedParams f <> EncodedParams g =
-    EncodedParams (f . g)
-
-instance Monoid EncodedParams where
-  mempty =
-    EncodedParams id
 
 newtype EncodeParams a = EncodeParams
   { run :: a -> [Param] -> [Param]
diff --git a/src/Data/RdsData/Encode/ToSqlParameters.hs b/src/Data/RdsData/Encode/ToSqlParameters.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/RdsData/Encode/ToSqlParameters.hs
@@ -0,0 +1,18 @@
+module Data.RdsData.Encode.ToSqlParameters
+  ( ToSqlParameters(..)
+  ) where
+
+import           Data.RdsData.Encode.Params
+import           Data.RdsData.Types.Param
+
+import qualified Amazonka.RDSData           as AWS
+
+class ToSqlParameters a where
+  toSqlParameters :: a -> [AWS.SqlParameter]
+
+instance ToSqlParameters [AWS.SqlParameter] where
+  toSqlParameters = id
+
+instance ToSqlParameters EncodedParams where
+  toSqlParameters encodedParams =
+    fmap toSqlParameter (encodedParams.run [])
diff --git a/src/Data/RdsData/Types/EncodedParams.hs b/src/Data/RdsData/Types/EncodedParams.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/RdsData/Types/EncodedParams.hs
@@ -0,0 +1,17 @@
+module Data.RdsData.Types.EncodedParams
+  ( EncodedParams(..)
+  ) where
+
+import           Data.RdsData.Types.Param
+
+newtype EncodedParams = EncodedParams
+  { run :: [Param] -> [Param]
+  }
+
+instance Semigroup EncodedParams where
+  EncodedParams f <> EncodedParams g =
+    EncodedParams (f . g)
+
+instance Monoid EncodedParams where
+  mempty =
+    EncodedParams id
