2014-02-10 2 views
0

Я хочу, чтобы получить значение, чтобы вставить таблицу в C#, что-то вроде этого:Oracle 12C: Возвращает запись после вставки значения

begin 
insert into bk_library(floor,section) values('foo2','bar') 
returning id into :outid; 
select *from bk_library where id=:outid; 
end; 

К сожалению, мне не удалось

информация об ошибке: Поцелуй .Linq.Linq2Sql.Test.EntryPoint.TestInsertReturnId: Oracle.DataAccess.Client.OracleException: ОР-06550: строка 3, столбец 1: PLS-00428: Ап в предложении, как ожидается, в этом ЗЕЬЕСТЕ


[Test] 
    public void TestInsertReturnId() 
    { 
     int ret = 0; 
     string connstring = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pdborcl)));User Id=system;Password=****;"; 

     string sql = @"insert into bk_library(floor,section) values('foo','bar') returning id into :outid"; 
     sql = getSqlString(); 
     using (DbConnection conn = new OracleConnection(connstring)) 
     { 
      conn.Open(); 
      DbCommand command = conn.CreateCommand(); 
      command.CommandType = CommandType.Text; 
      command.CommandText = sql; 

      OracleParameter lastId = new OracleParameter(":outid", OracleDbType.Int32); 
      lastId.Direction = ParameterDirection.Output; 
      command.Parameters.Add(lastId); 
      ret = command.ExecuteNonQuery(); 

       // this code work fine ,now I want to get the entire record 
      LogManager.GetLogger<EntryPoint>().Info("The new id ={0}", lastId.Value.ToString()); 

      conn.Close(); 
     } 
     Assert.AreNotEqual(ret, 0); 
    } 
+0

Что вы действительно пытаетесь сделать? Вы только что создали «строку» в базе данных, и у вас уже есть данные, зачем их снова получать? Возможно, посмотрите на Entity Framework или LinqToSql? – flindeberg

+0

В этом случае основной столбец таблицы является идентификатором (http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php), когда вставляйте значение, которое я не знаю id, теперь я хочу получить всю запись. – Aliceljm

+0

Да, но вы возвращаете идентификатор из запроса, зачем вам нужна вся запись? А так как вы не используете какие-либо рамки моделирования? – flindeberg

ответ

0

ParameterDirection должен быть ReturnValue

lastId.Direction = ParameterDirection.ReturnValue; 
+0

Моя ошибка, этот код «LogManager.GetLogger () .Info (« Новый id = {0} », lastId.Value.ToString());« отлично работать, я могу получить идентификатор, теперь я хочу получить вся запись не только ID. – Aliceljm

0

С < http://arjudba.blogspot.ch/2008/07/pls-00428-into-clause-is-expected-in.html?m=1>

Вам нужно написать SELECT * INTO some_variable FROM bk_library вместо SELECT * FROM bk_library, потому что я предполагаю, что вы хотите хранить данные, полученные каким-то образом , Поэтому вам нужно объявить новую переменную some_variable (предположим строку типа) и изменить инструкцию SELECT, как указано выше. Затем данные из инструкции будут сохранены в вашей новой переменной.

Надеюсь, что это поможет

+0

Спасибо, ты вдохновил меня, я меняю свой sql следующим образом: declare idnum integer; begin Вставить в bk_library (пол, раздел) значения ('foo2', 'bar') возвращение id в: outid; выберите id в idnum из bk_library где id =: outid; конец; Теперь я хочу получить значение всех столбцов, как я могу это сделать? – Aliceljm

+1

См. Http://www.oracle.com/technetwork/issue-archive/2012/12-may/o32plsql-1578019.html – nagyben

+0

Спасибо, теперь у меня есть этот sql: declare bk_library_shadow bk_library% ROWTYPE; begin Вставить в bk_library (floor, section) значения ('foo2', 'bar') вернуть id в: outid; выберите * в bk_library_shadow из bk_library, где id =: outid; конец; – Aliceljm

Смежные вопросы