我使用"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“工具中配置了相同的用户和连接)
谢谢!
发布于 2018-12-17 06:01:54
就Lavarel而言,不可能直接从Lavarel执行PL/SQL块。
所以最好的(只有?)一种选择是,首先使用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。
https://stackoverflow.com/questions/53802110
复制相似问题