Laravel 5.7.13 - Как выполнить инструкцию Oracle PL / SQL Declare-Begin-End - PullRequest
0 голосов
/ 16 декабря 2018

Я подключаюсь к БД Oracle с помощью инструмента «Oracle SQL Developer» и могу успешно выполнять операторы, подобные следующим (например):

DECLARE
p0_ VARCHAR2(32000) := 'Charlie';
p1_ FLOAT := 35;
p2_ VARCHAR2(32000) := 'Spain';
...
BEGIN
Users.Validate(p0_,p1_,p2_ ....);
END;

Кроме того, я могу выполнять достаточно простые запросы, такие как Select * from ....Сервер отвечает через 4-5 секунд.

Моя проблема: у меня есть проект Laravel 5.7.13 с оракулом (модуль yajra / laravel-oci8), и он работает нормально, когда я запускаю простые запросы, такие как Select ...:

DB::select("Select ...");

Но я не могу запустить начальный оператор:

DB::select("DECLARE
    p0_ VARCHAR2(32000) := 'Charlie';
    p1_ FLOAT := 35;
    p2_ VARCHAR2(32000) := 'Spain';
    ...
    BEGIN
    Users.Validate(p0_,p1_,p2_ ....);
    END;");

Я также пытался использовать оператор DB::Select(DB::raw("DECLARE ...")) и DB::Statement(...), но не работает.

Я использую Xampp и apache, и когда я пытаюсь выполнить эти операторы, Apache не отвечает, никаких ошибок, просто похоже, что пытается выполнить оператор, но не завершает работу, даже если у меня тайм-аут 10 секунд (max_execution_time=10 в php.ini, а также принудительно введен моим php-кодом с инструкцией: ini_set('max_execution_time', 10)).

Как я могу выполнить такое утверждение из Laravel?Может быть проблема с разрешениями пользователя?(Я настроил в Laravel и "Oracle SQL Developer" того же пользователя и соединение)

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Что касается согласования, невозможно выполнить блок PL / SQL непосредственно из Lavarel.

Так что лучшим (только?) Вариантом будет сначала создать хранимую процедуру непосредственно в базе данных,используя SQLDeveloper или другой клиент Oracle, а затем вызвать его из Lavarel, передав ему соответствующие аргументы.

Вот пример, основанный на вашем случае использования:

1) Создайте хранимую процедуру (Примечание: максимальный размер Oracle varchar2 равен 4000, а не 32000):

CREATE OR REPLACE PROCEDURE myproc
(
    p0 IN VARCHAR2(4000),
    p1 IN FLOAT,
    p2 IN VARCHAR2(4000)
)
AS
BEGIN
    Users.Validate(p0,p1,p2);
END;

2) Вызовите хранимую процедуру из Lavarel:

DB::statement('exec myproc("Charlie", 35, "Spain")');

Если вам необходимо вернутьсячто-то из процедуры, используйте DB::select вместо DB::statement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...