Вести с полей. Запросы с «RETURNING INTO»

Привет всем.

Вчера выложили бинарники очередного релиза IBProvider’a — сборка 3.15.0.14897. С моей точки зрения в этом выпуске выправлена внутренняя архитектура провайдера и закрыты накопившиеся висяки в отношении пока еще не выпущенного Firebird 3. С пользовательской точки зрения это выглядит так.

Но, как говорится, это дела минувших дней. На повестке дня у нас реализация следующей моей давней идеи — явное указание имен для OUT-параметров в запросах вида «INSERT … RETURNING», «UPDATE .. RETURNING» и так далее.

Предлагаю не изобретать велосипед, а украсть позаимствовать синтаксис из PSQL — «… RETURNING … INTO …».

Выглядеть это будет приблизительно так:

using System;
using System.Data;
using xdb=lcpi.data.oledb;

namespace ConsoleApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   const string c_cn_str
    ="provider=LCPI.IBProvider.3;"
    +"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;"
    +"user id=gamer;"
    +"password=vermut;";

   try
   {
    using(var cn=new xdb.OleDbConnection(c_cn_str))
    {
     cn.Open();

     using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead))
     {
      using(var cmd=new xdb.OleDbCommand("",cn,tr))
      {
       cmd.CommandText="insert into NUM (N_4_0) values (4321)\n"
                       +"returning -TEST_ID, -N_4_0\n"
                       +"into :a, :b";

       cmd.Parameters.Refresh();

       var rows_affected=cmd.ExecuteNonQuery();

       Console.WriteLine("RowsAffected: {0}",rows_affected);

       Console.WriteLine("a: {0}",cmd["a"].Value);
       Console.WriteLine("b: {0}",cmd["b"].Value);
      }//using cmd

      tr.Rollback();
     }//using tr
    }//using cn
   }
   catch(Exception exc)
   {
    Console.WriteLine("ERROR: [{0}] - {1}",exc.Source,exc.Message);
   }
  }//Main
 }//class Program
}//ConsoleApplication

На выходе получается что-то вроде:


output of test for

Мне нравится. А остальным придется смириться 🙂

2 комментария

dimitr  on 12 апреля, 2013

велосипед изобретаешь?
returning -TEST_ID as A, -N_4_0 as B

Kovalenko  on 12 апреля, 2013

Интересное предложение.

Работает на тройке, но не работает на FB2.5 🙂

Тем не менее — спасибо, буду думать.

Вообще была потребность в явной привязке именно (маркера) параметра к возвращаемому значению.

Например, для запроса «insert into t (col) values(@x) returning col into @x» провайдер сформирует один IN-OUT параметр с именем x.

А вот с «insert into t (col) values(@x) returning col as x» уже будет не все так гладко.


Вообще, я понимаю чем мне грозит прикручивание INTO. Но, думаю, если что — я асилю необходимые изменения в своем парсере запросов.

Leave a Comment