Laravel 5.7.13-如何执行Oracle PL / SQL Declare-Begin-End语句

时间:2018-12-16 12:28:42

标签: php oracle laravel plsql

我使用“ Oracle SQL Developer”工具连接到Oracle DB,并且可以成功运行以下语句(例如):

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

此外,我可以成功运行诸如Select * from ...之类的简单查询。服务器将在4-5秒内响应。

我的问题: 我有一个带有oracle连接的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的超时时间秒(在php.ini中为max_execution_time=10,也是由我的php代码强制执行的,并带有指令:ini_set('max_execution_time', 10))。

如何从Laravel执行此类声明? 可能是用户权限问题? (我已经在Laravel和“ Oracle SQL Developer”工具中配置了相同的用户和连接)

谢谢!

1 个答案:

答案 0 :(得分:0)

就所关心的而言,不可能直接从Lavarel执行PL / SQL块。

因此,最好的选择(唯一?)是首先使用SQLDeveloper或其他Oracle客户端直接在数据库中创建一个存储过程,然后从Lavarel调用它,并将相关参数传递给它。

以下是基于您的用例的示例:

1)创建存储过程(NB: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