如何调用以对象类型为输出参数的Oracle存储过程?(PLS-00306:调用中的参数数量或类型错误)



如何调用以对象类型为输出参数的Oracle存储过程(PLS-00306:调用中的参数数量或类型错误(

你好,

我试图从PHP Lumen v6.3调用一个存储过程,它在Oracle中定义如下:

PROCEDURE PRC_REGION_LIST(
p_TYPE          IN    SMALLINT,
p_REGION_LIST   OUT   CT_LST_REGION,
p_COD_ERROR     OUT   NUMBER, 
p_DES_ERROR     OUT   VARCHAR2)
IS
v_LST_AUX CT_LST_REGION;
BEGIN
..........
EXCEPTION 
WHEN OTHERS THEN 
p_COD_ERROR := SQLCODE; 
p_DES_ERROR := SQLERRM; 
END PRC_REGION_LIST;
create or replace TYPE "CT_LST_REGION" AS TABLE OF T_LST_REGION;
create or replace TYPE "T_LST_REGION" AS OBJECT (
REG_ID      NUMBER(10,0),
REG_NAME    VARCHAR2(50 BYTE)
);

在我的控制器中,我有一个名为getRegionsPDO((的函数,其中该过程是手动执行的,另一个函数名为
getRegionsYajra((

<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
use PDO;
class ExampleController extends Controller
{
public function getRegionsPDO()
{
$procedureName = 'PKG_NAME.PRC_REGION_LIST';
$p_TYPE = 1;
$p_REGION_LIST = "-";
$p_COD_ERROR = "-";
$p_DES_ERROR = "-";
$pdo = DB::getPdo();
$pdo = $pdo->prepare("begin {$procedureName}(:p_TYPE, :p_REGION_LIST, :p_COD_ERROR, :p_DES_ERROR); end;");
$pdo->bindParam(':p_TYPE', $p_TYPE, PDO::PARAM_INT);
$pdo->bindParam(':p_REGION_LIST', $p_REGION_LIST, PDO::PARAM_STR);
$pdo->bindParam(':p_COD_ERROR', $p_COD_ERROR, PDO::PARAM_INT);
$pdo->bindParam(':p_DES_ERROR', $p_DES_ERROR, PDO::PARAM_STR);
$pdo->execute();
dd($pdo);
}
public function getRegionsYajra()
{
$procedureName = 'PKG_NAME.PRC_REGION_LIST';
$bindings = [
'p_TYPE' => 1
];
$result = DB::executeProcedure($procedureName, $bindings);
dd($result);
}
}

当我调用getRegionsPDO((时,它会显示以下消息:

<h3 class="trace-class">
<span class="text-muted">(1/1)</span>
<span class="exception_title">
<abbr title="YajraPdoOci8ExceptionsOci8Exception">Oci8Exception</abbr>
</span>
</h3>
<p class="break-long-words trace-message">
Error Code    : 6550
<br>
Error Message : ORA-06550: line 1, column 7:
<br>
PLS-00306: wrong number or types of arguments in call to 'PRC_REGION_LIST'
<br>
ORA-06550: line 1, column 7:
<br>
PL/SQL: Statement ignored
<br>
Position      : 6
<br>
Statement     : begin PKG_NAME.PRC_REGION_LIST(:p_TYPE, :p_REGION_LIST, :p_COD_ERROR, :p_DES_ERROR); end;
<br>
Bindings      : [1,-,0,-]
<br>
</p>

当我调用getRegionsYajra((时,它会显示以下内容:

<h3 class="trace-class">
<span class="text-muted">(1/1)</span>
<span class="exception_title">
<abbr title="YajraPdoOci8ExceptionsOci8Exception">Oci8Exception</abbr>
</span>
</h3>
<p class="break-long-words trace-message">
Error Code    : 6550
<br>
Error Message : ORA-06550: line 1, column 7:
<br>
PLS-00306: wrong number or types of arguments in call to 'PRC_REGION_LIST'
<br>
ORA-06550: line 1, column 7:
<br>
PL/SQL: Statement ignored
<br>
Position      : 6
<br>
Statement     : begin PKG_NAME.PRC_REGION_LIST(:p_TYPE); end;
<br>
Bindings      : [1]
<br>
</p>

我想知道是否有人可以帮助我从控制器中以正确的方式调用存储过程所需的代码。我知道错误在我的p_REGION_LIST参数中。

PS:我无法修改Oracle数据库中的内容。

系统详细信息

  • 操作系统:Windows 10
  • PHP v7.4.10
  • Laravel版本:Lumen Framework v6.3
  • Laravel-OCI8 v6.1.1
  • laravel-pdo-via-oci8 v2.1.1

非常感谢大家对的帮助

在匿名BEGIN/END块中,使用PHP可以绑定到的简单类型组成或分解过程的对象参数。

甲骨文免费PDF的第209页上有一个相关的例子http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html

最新更新