Php 如何通过PL/SQL将结构传递给oracle过程-绑定问题
我正在尝试通过PL/SQL将日志发送到远程oracle数据库。它被发送到程序记录\u MANAGEMENT.ADD\u to(@文章底部)。这个过程有点像一个入口点 挑战存在于过程期望的4种对象类型中 我试过两件事:Php 如何通过PL/SQL将结构传递给oracle过程-绑定问题,php,arrays,oracle,plsql,procedure,Php,Arrays,Oracle,Plsql,Procedure,我正在尝试通过PL/SQL将日志发送到远程oracle数据库。它被发送到程序记录\u MANAGEMENT.ADD\u to(@文章底部)。这个过程有点像一个入口点 挑战存在于过程期望的4种对象类型中 我试过两件事: 尝试隐式调用-此处不会绑定数组 原始方法-语法错误 更新#1 3.类似于第二种方式;这将在原始PL中以字符串形式插入变量 //for all 4 object types it reports this err oci_execute(): ORA-06550: line 2, c
//for all 4 object types it reports this err
oci_execute(): ORA-06550: line 2, column 11:
PLS-00201: identifier 'PROJ_DB.EMPLOYEE_TYPE' must be declared
ORA-06550: line 2, column 11:
//on three occasions this is also stated
PL/SQL: Item ignored
ORA-06550: line 19, column 3:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
如果有人有任何建议,那将非常有帮助!最近刚开始“Oragling”
第一次尝试的例子
$var1 = ["1111", null, null, null, null, null, null, null, null, null, null, null];
$var2 = 'String 1';
$var3 = ["String 2", null, null, null, null, null, null, null, null, null];
$var4 = '2020-06-03 07:00:00';
$var5 = ["String 3",null,null];
$var6 = ["String 4",null];
$var7 = '222222';
$var8 = NULL;
$var9 = NULL;
$var10= 'String 5';
$var11= '333333';
$var12= '444444';
$var13= '555555';
$var14= '666666';
$var15= NULL;
$stmt = oci_parse($conn, "BEGIN PROJ_DB.RECORD_MANAGEMENT.ADD_INTO(:val1, :val2, :val3, :val4, :val5, :val6, :val7, :val8, :val9, :val10, :val11, :val12, :val13, :val14, :val15); END;");
oci_bind_array_by_name($stmt,':var1',$var1,count($var1),-1);
oci_bind_by_name($stmt,':var2', $var2);
oci_bind_array_by_name($stmt,':var3', $var3,count($var3),-1);
oci_bind_by_name($stmt,':var4', $var4);
oci_bind_array_by_name($stmt,':var5', $var5,count($var5),-1);
oci_bind_array_by_name($stmt,':var6', $var6,count($var6),-1);
oci_bind_by_name($stmt,':var7', $var7);
oci_bind_by_name($stmt,':var8', $var8);
oci_bind_by_name($stmt,':var9', $var9);
oci_bind_by_name($stmt,':var10', $var10);
oci_bind_by_name($stmt,':var11', $var11);
oci_bind_by_name($stmt,':var12', $var12);
oci_bind_by_name($stmt,':var13', $var13);
oci_bind_by_name($stmt,':var14', $var14);
oci_bind_by_name($stmt,':var15', $var15);
oci_execute($stmt);
第二次尝试的示例(尝试了不同的语法A:A:=A)
在第三次尝试的示例中,变量作为字符串插入到pl中,从而避免了绑定
//$var1-3-5-6 is not anymore array
VAR_A := PROJ_DB.EMPLOYEE_TYPE($var1, null, null, null, null, null, null, null, null, null, null, null);
VAR_B :='".$var2."';
VAR_C := PROJ_DB.PROJECT_TYPE($var3, null, null, null, null, null, null, null, null, null);
VAR_D := to_date('".$var4."', 'dd.mm.yyyy hh24:mi:ss');
VAR_E := PROJ_DB.SYSTEM_TYPE($var5, null, null);
VAR_F := PROJ_DB.ACTION_TYPE('".$var6."', null);
VAR_G :=$var7;
VAR_H :=NULL;
VAR_I :=NULL;
VAR_J :='".$var10."';
VAR_K :=$var11;
VAR_L :=$var12;
VAR_M :=$var13;
VAR_N :=$var14;
VAR_O := NULL;
程序的一个条目示例(第二次尝试基于此示例)
不要试图传入对象类型。相反,传递用于初始化对象类型的值。您可以
首先在中间变量中声明
项,也可以直接将它们初始化到过程的参数中,而不使用中间变量:
开始
记录\u管理。将\u添加到(
变量A=>PROJ\u DB.EMPLOYEE\u类型(
:var_a,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null
),
VAR_B=>:VAR_B,
VAR_C=>PROJ_DB.PROJECT_类型(
:var_c,null,null,null,null,null,null,null,null,null,null,null
),
VAR_D=>截止日期(:VAR_D,'dd.mm.yyyyyh24:mi:ss'),
VAR_E=>项目数据库系统类型(:VAR_E,null,null),
VAR\u F=>项目数据库操作类型(:VAR\u F,null),
VAR\u G=>:VAR\u G,
VAR_H=>:VAR_H,
变量I=>:变量I,
VAR_J=>:VAR_,
VAR_K=>:VAR_K,
VAR_L=>:VAR_L,
VAR_M=>:VAR_M,
变量N=>:变量N,
VAR\u O=>:VAR\u O
);
犯罪
结束;
不要试图传入对象类型。相反,传递用于初始化对象类型的值。您可以首先在中间变量中声明
项,也可以直接将它们初始化到过程的参数中,而不使用中间变量:
开始
记录\u管理。将\u添加到(
变量A=>PROJ\u DB.EMPLOYEE\u类型(
:var_a,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null
),
VAR_B=>:VAR_B,
VAR_C=>PROJ_DB.PROJECT_类型(
:var_c,null,null,null,null,null,null,null,null,null,null,null
),
VAR_D=>截止日期(:VAR_D,'dd.mm.yyyyyh24:mi:ss'),
VAR_E=>项目数据库系统类型(:VAR_E,null,null),
VAR\u F=>项目数据库操作类型(:VAR\u F,null),
VAR\u G=>:VAR\u G,
VAR_H=>:VAR_H,
变量I=>:变量I,
VAR_J=>:VAR_,
VAR_K=>:VAR_K,
VAR_L=>:VAR_L,
VAR_M=>:VAR_M,
变量N=>:变量N,
VAR\u O=>:VAR\u O
);
犯罪
结束;
我们需要知道PL/SQL过程和类型定义。PHPOci8不支持许多PL/SQL对象类型,因此您可能需要使用从PHP调用的某种“包装器”PL/SQL块,然后调用当前的PL/SQL过程。检查和。在我成功地将值绑定到过程参数并调用oci_execute($stmt)后,我在所有4种对象类型上都出现了错误。显示此错误:ORA-06550-PL/SQL:语句被忽略。简言之,我无法看到我的用户对象类型,所以由于访问受限,过程无法找到它们。在给管理员发电子邮件后,我获得了访问权限,现在一切都顺利运行!我们需要知道PL/SQL过程和类型定义。PHPOci8不支持许多PL/SQL对象类型,因此您可能需要使用从PHP调用的某种“包装器”PL/SQL块,然后调用当前的PL/SQL过程。检查和。在我成功地将值绑定到过程参数并调用oci_execute($stmt)后,我在所有4种对象类型上都出现了错误。显示此错误:ORA-06550-PL/SQL:语句被忽略。简言之,我无法看到我的用户对象类型,所以由于访问受限,过程无法找到它们。在给管理员发电子邮件后,我获得了访问权限,现在一切都顺利运行!通过这种方式实现,绑定就像一种魅力。谢谢通过这种方式实现,绑定就像一种魅力。谢谢
$var1 = ["1111", null, null, null, null, null, null, null, null, null, null, null];
$var2 = 'String 1';
$var3 = ["String 2", null, null, null, null, null, null, null, null, null];
$var4 = '2020-06-03 07:00:00';
$var5 = ["String 3",null,null];
$var6 = ["String 4",null];
$var7 = '222222';
$var8 = NULL;
$var9 = NULL;
$var10= 'String 5';
$var11= '333333';
$var12= '444444';
$var13= '555555';
$var14= '666666';
$var15= NULL;
$stmt = oci_parse($conn, "BEGIN PROJ_DB.RECORD_MANAGEMENT.ADD_INTO(:val1, :val2, :val3, :val4, :val5, :val6, :val7, :val8, :val9, :val10, :val11, :val12, :val13, :val14, :val15); END;");
oci_bind_array_by_name($stmt,':var1',$var1,count($var1),-1);
oci_bind_by_name($stmt,':var2', $var2);
oci_bind_array_by_name($stmt,':var3', $var3,count($var3),-1);
oci_bind_by_name($stmt,':var4', $var4);
oci_bind_array_by_name($stmt,':var5', $var5,count($var5),-1);
oci_bind_array_by_name($stmt,':var6', $var6,count($var6),-1);
oci_bind_by_name($stmt,':var7', $var7);
oci_bind_by_name($stmt,':var8', $var8);
oci_bind_by_name($stmt,':var9', $var9);
oci_bind_by_name($stmt,':var10', $var10);
oci_bind_by_name($stmt,':var11', $var11);
oci_bind_by_name($stmt,':var12', $var12);
oci_bind_by_name($stmt,':var13', $var13);
oci_bind_by_name($stmt,':var14', $var14);
oci_bind_by_name($stmt,':var15', $var15);
oci_execute($stmt);
$proc="
DECLARE
VAR_A PROJ_DB.EMPLOYEE_TYPE;
VAR_B VARCHAR2(200);
VAR_C PROJ_DB.PROJECT_TYPE;
VAR_D DATE;
VAR_E PROJ_DB.SYSTEM_TYPE;
VAR_F PROJ_DB.ACTION_TYPE;
VAR_G NUMBER;
VAR_H VARCHAR2(200);
VAR_I VARCHAR2(200);
VAR_J CLOB;
VAR_K NUMBER;
VAR_L NUMBER;
VAR_M NUMBER;
VAR_N NUMBER;
VAR_O VARCHAR2(200);
BEGIN
VAR_A var1;
VAR_B var2;
VAR_C var3;
VAR_D var4;
VAR_E var5;
VAR_F var6;
VAR_G var7;
VAR_H var8;
VAR_I var9;
VAR_J var10;
VAR_K var11;
VAR_L var12;
VAR_M var13;
VAR_N var14;
VAR_O var15;
RECORD_MANAGEMENT.ADD_INTO(
VAR_A => VAR_A,
VAR_B => VAR_B,
VAR_C => VAR_C,
VAR_D => VAR_D,
VAR_E => VAR_E,
VAR_F => VAR_F,
VAR_G => VAR_G,
VAR_H => VAR_H,
VAR_I => VAR_I,
VAR_J => VAR_J,
VAR_K => VAR_K,
VAR_L => VAR_L,
VAR_M => VAR_M,
VAR_N => VAR_N,
VAR_O => VAR_O
);
COMMIT;
END;
";
//variables same as in first example
$stmt = oci_parse($conn, $proc);
//binding also same
oci_execute($stmt);
//$var1-3-5-6 is not anymore array
VAR_A := PROJ_DB.EMPLOYEE_TYPE($var1, null, null, null, null, null, null, null, null, null, null, null);
VAR_B :='".$var2."';
VAR_C := PROJ_DB.PROJECT_TYPE($var3, null, null, null, null, null, null, null, null, null);
VAR_D := to_date('".$var4."', 'dd.mm.yyyy hh24:mi:ss');
VAR_E := PROJ_DB.SYSTEM_TYPE($var5, null, null);
VAR_F := PROJ_DB.ACTION_TYPE('".$var6."', null);
VAR_G :=$var7;
VAR_H :=NULL;
VAR_I :=NULL;
VAR_J :='".$var10."';
VAR_K :=$var11;
VAR_L :=$var12;
VAR_M :=$var13;
VAR_N :=$var14;
VAR_O := NULL;
DECLARE
VAR_A PROJ_DB.EMPLOYEE_TYPE;
VAR_B VARCHAR2(200);
VAR_C PROJ_DB.PROJECT_TYPE;
VAR_D DATE;
VAR_E PROJ_DB.SYSTEM_TYPE;
VAR_F PROJ_DB.ACTION_TYPE;
VAR_G NUMBER;
VAR_H VARCHAR2(200);
VAR_I VARCHAR2(200);
VAR_J CLOB;
VAR_K NUMBER;
VAR_L NUMBER;
VAR_M NUMBER;
VAR_N NUMBER;
VAR_O VARCHAR2(200);
BEGIN
VAR_A := PROJ_DB.EMPLOYEE_TYPE(11111, null, null, null, null, null, null, null, null, null, null, null);
VAR_B := 'String 1';
VAR_C := PROJ_DB.PROJECT_TYPE('String 2', null, null, null, null, null, null, null, null, null);
VAR_D := to_date('24.02.2020 08:00:00', 'dd.mm.yyyy hh24:mi:ss');
VAR_E := PROJ_DB.SYSTEM_TYPE('String 3', null, null);
VAR_F := PROJ_DB.ACTION_TYPE('String 4', null);
VAR_G := 2222222;
VAR_H := NULL;
VAR_I := NULL;
VAR_J := 'String 5';
VAR_K := 3333333;
VAR_L := 4444444;
VAR_M := 5555555;
VAR_N := 6666666;
VAR_O := NULL;
RECORD_MANAGEMENT.ADD_INTO(
VAR_A => VAR_A,
VAR_B => VAR_B,
VAR_C => VAR_C,
VAR_D => VAR_D,
VAR_E => VAR_E,
VAR_F => VAR_F,
VAR_G => VAR_G,
VAR_H => VAR_H,
VAR_I => VAR_I,
VAR_J => VAR_J,
VAR_K => VAR_K,
VAR_L => VAR_L,
VAR_M => VAR_M,
VAR_N => VAR_N,
VAR_O => VAR_O
);
COMMIT;
END;