Хобрук: Ваш путь к мастерству в программировании

Как я могу вызвать эту хранимую процедуру в PHP?

Существует хранимая процедура оракула, которую мне нужно вызвать и получить ее выходную переменную, но я не уверен, как это сделать из PHP. Я также использую фреймворк Laravel.

Вот что у меня есть до сих пор.

$db = DB::connection('oracle');
$stmt = $db->getPdo()->prepare("EXEC jgreen.person_match(p_first_name => 'Bob'
    , p_last_name => 'Mitchell'
    , p_middle_name => ''
    , p_birth_date => to_date('1982-02-09', 'YYYY-MM-DD')
    , p_gender => null
    , p_email => '[email protected]'
    , p_phone => null
    , p_ssn_last_4 => null
    , p_id_out => ?
    , p_suspend_out => ?
    , p_status_out => ?
    , p_message_out => ?)");
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $suspend);
$stmt->bindParam(3, $status);
$stmt->bindParam(4, $message);

$stmt->execute();

echo $status . ' ' . $message . ' ' . $pidm . ' ' . $suspend;

В настоящее время я получаю

oci_bind_by_name(): ORA-01036: недопустимое имя/номер переменной

но я даже не уверен, что правильно построил запрос для начала.

11.09.2018

  • Укажите точный текст ошибки. 11.09.2018
  • oci_bind_by_name(): ORA-01036: недопустимое имя/номер переменной 11.09.2018
  • Отсутствует одинарная кавычка в начале адреса электронной почты. 11.09.2018
  • Ошибка форматирования поста, а не проблема. Я исправлю это на своем примере. 11.09.2018
  • Попробуйте BEGIN jgreen.person_match(...); END; вместо EXEC jgreen.person_match(...) 11.09.2018

Ответы:


1

Попробуй это

$db = DB::connection('oracle');
$stmt = $db->getPdo()->prepare("EXEC jgreen.person_match(p_first_name => :first_name
    , p_last_name => :last_name
    , p_middle_name => :middle_name
    , p_birth_date => to_date(:birth_date, 'YYYY-MM-DD')
    , p_gender => :gender
    , p_email => :email
    , p_phone => :phone
    , p_ssn_last_4 => :ssn
    , p_id_out => :id_out
    , p_suspend_out => :suspend_out
    , p_status_out => :status_out
    , p_message_out => :message_out)");
$stmt->bindValue(':first_name', 'Bob');
$stmt->bindValue(':last_name', 'Mitchell');
$stmt->bindValue(':middle_name', '');
$stmt->bindValue(':birth_date', '1982-02-09');
$stmt->bindValue(':gender', null);
$stmt->bindValue(':email','[email protected]');
$stmt->bindValue(':ssn', null);
$stmt->bindParam(':id_out', $id);
$stmt->bindParam(':suspend_out', $suspend);
$stmt->bindParam(':status_out', $status);
$stmt->bindParam(':message_out', $message);

$stmt->execute();

echo $status . ' ' . $message . ' ' . $pidm . ' ' . $suspend;
11.09.2018
  • При этом я получаю сообщение об ошибке: невозможно передать параметр 2 по ссылке 11.09.2018
  • Ааа, это потому, что bindParam используется там, где вторым параметром является строка. Я обновил ответ соответственно. 11.09.2018
  • Если бы вы затем изменили поля, такие как first_name, на переменную, вам нужно было бы изменить метод с bindValue обратно на bindParam 11.09.2018
  • Извините, это все еще не удается с сообщением об ошибке 900: ORA-00900: неверный оператор SQL Позиция: 0 Оператор 11.09.2018
  • Кажется, это связано с запросом, а не с тем, как PHP его строит. Попробуйте изменить EXEC на CALL и посмотрите, изменится ли это. 11.09.2018
  • Проблема, похоже, в том, что PDO плохо работает с Oracle. Вместо этого я использовал драйвер OCI8 для вызова. Поскольку ваш ответ правильный, если PDO сработал, я приму его. 21.09.2018

  • 2

    Похоже, вы определяете массив, похожий на PHP, для передачи параметров, но я совершенно уверен, что это недопустимо в Oracle. Вместо этого вызывайте хранимую процедуру как набор параметров вместо массива:

    $stmt = $db->getPdo()->prepare("EXEC jgreen.person_match(
      'Bob',
      'Mitchell',
      '',
      to_date('1982-02-09', 'YYYY-MM-DD'),
      null,
      '[email protected]',
      null,
      null,
      ?,
      ?,
      ?,
      ?
    )");
    
    11.09.2018
  • Хотите верьте, хотите нет, но этот стиль массива является допустимым plsql. Попробуйте сами как-нибудь. 11.09.2018
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..