当前位置: 首页 > 面试题库 >

将PHP数组传递到Oracle Stored Proc(PLS-00306:错误的参数数目或类型)

梅安平
2023-03-14
问题内容

使用PHP 5.3.2和Oracle 11G,我试图将数组从PHP传递到oracle存储的proc中。这是我的PL / SQL:

create or replace type NUM_ARRAY as table of number;

create or replace package txa as

  procedure upsert_txa_compliance_slct( v_compl_id_array  in num_array);

end txa;

create or replace package body txa as

    procedure upsert_txa_compliance_slct(v_compl_id_array  in num_array)
    is
    begin
        .
        . -- sql code removed for brevity.  package and body compile no errors
        .
    end upsert_txa_compliance_slct;

end;

查询:

  $sql = "begin txa.upsert_txa_compliance_slct(:my_array); end;";

还有我尝试绑定数组并执行的PHP代码:

第一的:

<?

$this->conn = ociplogon($dbuser, $dbpass, $dbname);
$this->commit_mode = OCI_COMMIT_ON_SUCCESS;
$this->sth = @ociparse($this->conn, $sql);

oci_bind_array_by_name($this->sth, 
                       ':my_array', 
                       $my_array, 
                       count($my_array), 
                       -1, 
                       SQLT_CHR);

$r = @ociexecute($this->sth, $this->commit_mode);

?>

会产生此错误:

PLS-00306:调用“ UPSERT_TXA_COMPLIANCE_SLCT”时参数的数量或类型错误

我显然传递了1个参数。那么,这是什么问题/如何解决类型问题?

另外我发现了这个

http://www.oracle.com/technetwork/articles/seliverstov-
multirows-098120.html

并使用oci收集以旧方式进行了尝试,如下所示:

 $collection = oci_new_collection($this->conn,"NUM_ARRAY");

在将我的oracle类型更改为此后:

create or replace type NUM_ARRAY as varray(100) of number;

我收到此错误:

oci_new_collection():ORA-22318:输入类型不是数组类型

任何帮助将非常感激。

编辑时间:美国东部时间2014年8月14日晚上7:08

我将我的php oci_bind函数调用更改为使用SQLT_NUM作为类型。这没有影响。然后,我将包裹更改为包括:

type num_array is table of number index by binary_integer;

(我还从我的架构中删除了原始的num_array)

此更改使将数组传递给存储的proc成为可能,但是这样我就不能将数组用作嵌套表,如下所示:

delete 
  from my_table
 where id not in (select column_value from table(v_compl_id_array));

当我尝试使用其中的语句编译程序包主体时,出现此错误:

PL/SQL: ORA-22905: cannot access rows from a non-nested table item

并且所有文档都告诉我要返回架构级别类型吗?但是,当我这样做时,我会遇到其他错误。我知道我可以找到另一种方法,可以在pl /
sql数组上使用循环,但是我真的很希望能够使用该架构级别类型。


问题答案:

答案是这样。您不能使用全局创建的或架构级别的类型作为存储过程的参数。PHP的oci_bind_array_by_name似乎不适用于全局创建的类型,但是您需要全局创建的类型才能将数组用作子选择中的嵌套表。所以....这就是我如何使它工作的。我非常高兴听到其他解决方案!!但是现在,这就是我所做的。

-- globally create a type table of number

create or replace type num_array is table of number;

-- in my package i created an internal type table of number

type i_num_array is table of number index by binary_integer;

-- i then used i_num_array (internal type) as the type for my IN parameter to the procedure

upsert_TXA_compliance_slct( v_compl_id_array  in i_num_array)

-- in my procedure i also created a variable that is the type of my globally created type

v_num_array num_array := num_array();

-- then i populated that variable in a loop inside my procedure with the values in my IN param

for i in 1 .. v_compl_id_array.count
loop
  v_num_array.extend(1);
  v_num_array(i) := v_compl_id_array(i);
end loop;

-- then i used v_num_array as my nested table so this now works:

delete from my_table where id in (select * from table(v_num_array));


 类似资料:
  • 我正在使用JPA调用oracle存储过程并获得下面提到的异常 我的问题是,当我在oracle中执行下面提到的匿名块时,它的工作没有任何问题 我不知道为什么我在JPA调用中得到这个?你能帮我解决它吗?

  • 我有一个Gradle构建脚本,我试图将Eric Wendelin的CSS插件包含其中。 它很容易实现,因为我只想缩小(而不是合并和gzip),所以我得到了构建脚本的相关部分,如下所示: 这是完美的-当我运行gradle war任务时,它会调用mini fyCss任务,获取源css文件,并在buildDir中创建一个缩小版本 但是,我有一些需要缩小的css文件,但没有组合成一个文件(因此我没有使用组

  • 问题内容: 我似乎记得在PHP中,有一种方法可以将数组作为函数的参数列表传递,以标准方式取消对数组的引用。但是现在我迷失了如何做。我记得通过引用传递的方式,如何“遍历”传入的参数……但没有如何将数组从列表中除名。 它可能和一样简单,但是我敢肯定不是。但是,可悲的是,到目前为止,php.net手册还没有透露任何内容。并不是说我在过去一年左右的时间里不得不使用此特定功能。 问题答案: call_use

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。

  • 问题内容: 对不起这个基本问题。我想将一个切片作为参数传递给。像这样: 结果将是,但这显然不起作用。 (我要格式化的字符串比这要复杂的多,因此,简单的串联是不会做到的:) 所以问题是:如果我有数组,如何将其作为单独的参数传递给?或者:我可以调用在Go中传递参数列表的函数吗? 问题答案: 正如您在IRC上发现的那样,它将起作用: 您的原始代码无法正常工作,因为接受a 并且无法将其隐式或显式转换为该类

  • 这里变量x(在主)的值是6,这是正确的,但当我写同样的事情在system.out.println== 当我尝试在print语句中放入x时,它工作得很好。但我想知道它给出错误的原因。 错误: