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



我使用"Oracle SQL Developer"工具连接到Oracle数据库,我可以成功运行这样的语句(例如(:

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"工具中配置了相同的用户和连接(

谢谢!

就目前而言,不可能直接从Lavarel执行PL/SQL块。

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

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

1( 创建存储过程(注意:Oraclevarchar2的最大大小是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( 从Lavalrel:调用存储过程

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

如果需要从过程中返回一些内容,请使用DB::select而不是DB::statement

最新更新