我试图通过PLSQL向远程oracle数据库发送日志。它被发送到过程RECORD_MANAGEMENT.ADD_INTO(帖子底部的@)。这个过程算是一个入口点。
挑战在于存储过程所期望的4种对象类型。
我试过两件事。
oci_execute(): ORA-06550: line 1, column 7: PLS-00306:
oci_bind_array_by_name(): ORA-01036: illegal variable name/number
更新#13. 类似于第二种方式;这在原始PL中以字符串的形式插入变量。
//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
如果有谁有什么建议,那将是非常有用的! 最近刚开始'oracling'。
第一次尝试的例子。
$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:=a)。
$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);
第三次尝试的例子,变量被作为字符串插入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;
存储过程的一个条目的例子(第二次尝试是基于这个例子)。
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;
不要试图传递对象类型。相反,传递你用来初始化对象类型的值。你可以 DECLARE
项先放在中间变量中,也可以直接将它们初始化到存储过程的参数中,不需要中间变量。
BEGIN
RECORD_MANAGEMENT.ADD_INTO(
VAR_A => PROJ_DB.EMPLOYEE_TYPE(
:var_a, null, null, null, null, null, null, null, null, null, null, null
),
VAR_B => :var_b,
VAR_C => PROJ_DB.PROJECT_TYPE(
:var_c, null, null, null, null, null, null, null, null, null
),
VAR_D => to_date(:var_d, 'dd.mm.yyyy hh24:mi:ss'),
VAR_E => PROJ_DB.SYSTEM_TYPE(:var_e, null, null),
VAR_F => PROJ_DB.ACTION_TYPE(:var_f, null),
VAR_G => :var_g,
VAR_H => :var_h,
VAR_I => :var_i,
VAR_J => :var_,
VAR_K => :var_k,
VAR_L => :var_l,
VAR_M => :var_m,
VAR_N => :var_n,
VAR_O => :var_o
);
COMMIT;
END;