Возвратите Параметр ROWID из оператора вставки с помощью соединения JDBC для оракула

попробуйте
Вид лезвия

@foreach ($post as $p)

{{$p->user->name }}

@endforeach

Контроллер

  public function main_page(){

    $post= Post::with('user')->latest()->get();


    return view('main' , compact('post') );
}

Модель post

  public function user(){

    $this->belongsTo('App\User');
}
5
задан Goyuix 25 March 2009 в 17:09
поделиться

4 ответа

Несколько вещей, которые вам нужно сделать

  • Измените CallableStatement на OracleCallableStatement
  • Попробуйте вернуться к NUMBER, то есть: OracleTypes.Number

Пример кода для возврата информации из запрос:

OraclePreparedStatement pstmt = (OraclePreparedStatement)conn.prepareStatement(
       "delete from tab1 where age < ? returning name into ?");
pstmt.setInt(1,18);

/** register returned parameter
  * in this case the maximum size of name is 100 chars
  */
pstmt.registerReturnParameter(2, OracleTypes.VARCHAR, 100);

// process the DML returning statement
count = pstmt.executeUpdate();
if (count>0)
{
  ResultSet rset = pstmt.getReturnResultSet(); //rest is not null and not empty
  while(rset.next())
  {
    String name = rset.getString(1);
    ...
  }
}

Подробнее о расширениях JDBC в Oracle:

6
ответ дан 18 December 2019 в 06:04
поделиться

Попытаться использовать? вместо: rowid0 на Вашей строке SQL. У меня были проблемы прежде с именованными параметрами и Oracle.

1
ответ дан 18 December 2019 в 06:04
поделиться

Не знайте, применяется ли это или не, так как Вы не указываете, какую версию Вы используете.

Из метассылки Oracle:

Причина

В 10.1.0.x не поддерживается драйвер JDBC, возвращая DML:

На FAQ JDBC: "10.1.0 (10 г r1) DML Возвращается Поддерживаемый? Не в формирователях тока. Однако у нас действительно есть планы поддерживать его в сообщении 10.1.0 драйвера. Мы действительно имеем в виду это на этот раз".

Поскольку код приложения пытается использовать неподдерживаемые функции JDBC, ошибки повышены.

Решение

Обновите драйвер JDBC до 10.2.0.x, потому что на FAQ 10.2.0.x драйверы JDBC действительно поддерживают пункт возврата:

"10.2.0 (10 г r2) DML Возвращается Поддерживаемый? ДА! И самое время. См. Руководство разработчика для деталей".

ОТРЕДАКТИРУЙТЕ Только для усмешек, можно проверить, что версия Oracle JDBC думает, что использует с:

 // Create Oracle DatabaseMetaData object
  DatabaseMetaData meta = conn.getMetaData();

  // gets driver info:
  System.out.println("JDBC driver version is " + meta.getDriverVersion());

Если это показывает драйвер 10.2.0.x JDBC или позже, то я вне идей, и возможно запрос поддержки оракулу в порядке...

3
ответ дан 18 December 2019 в 06:04
поделиться

Обычно вы не хотите делать базу данных кода зависимой. Вместо OraclePreparedStatement вы должны использовать CallableStatement.

CallableStatement statement = connection.prepareCall("{call INSERT INTO tableA (some_id) VALUES (1) RETURNING ROWID INTO ? }");
statement.registerOutParameter( 1, Types.VARCHAR );

int updateCount = statement.executeUpdate();
if (updateCount > 0) {
   return statement.getString(1);
}
15
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: