如何使用 VARRAY 参数调试存储过程?
How I can debug a stored procedure with a VARRAY parameter?
我在 TOAD 中调试带有两个 VARRAY 参数的程序时遇到了一些麻烦。我在我的数据库中定义了这个 VARRAY:
CREATE OR REPLACE TYPE BDD_ACTIVOSEPAREP.TORDEN_CAMPO as VARRAY(7) of VARCHAR2(13);
现在我想调试一个需要这个 varray 作为参数的程序,但是当我执行调试时出现这个错误:
ORA-06550: line 46, column 21: PLS-00316: PL/SQL TABLEs must use a single index
ORA-06550: line 46, column 3: PL/SQL: Statement ignored
ORA-06550: line 47, column 20: PLS-00316: PL/SQL TABLEs must use a single index
ORA-06550: line 47, column 3: PL/SQL: Statement ignored
这是我要执行的代码:
DECLARE
PIVTABLA VARCHAR2(32767);
PIVIFGD VARCHAR2(32767);
PIVPERIODO_INICIAL NUMBER;
PIVPERIODO_FINAL NUMBER;
PIVPERIODO_EVENTO_INICIAL NUMBER;
PIVPERIODO_EVENTO_FINAL NUMBER;
PIVCUENTA VARCHAR2(32767);
PIVENTIDAD VARCHAR2(32767);
PIVMACRO VARCHAR2(32767);
PIVDEPENDENCIA VARCHAR2(32767);
PIVIDPARTIC VARCHAR2(32767);
PIVNIFCLIENTE VARCHAR2(32767);
PIVNOMBCLIENTE VARCHAR2(32767);
PIVNIFGRUPO VARCHAR2(32767);
PIVNOMBGRUPO VARCHAR2(32767);
PIVCODA VARCHAR2(32767);
PIVDIFERIDA VARCHAR2(32767);
PIVTI VARCHAR2(32767);
PIVFILTROANULACION VARCHAR2(32767);
PIVORDEN_CAMPO BDD_ACTIVOSEPAREP.TORDEN_CAMPO;
PIVORDEN_TIPO BDD_ACTIVOSEPAREP.TORDEN_CAMPO;
PINREG_INICIAL NUMBER;
PINREG_FINAL NUMBER;
XMLFINAL XMLTYPE;
BEGIN
PIVTABLA := 'F01';
PIVIFGD := NULL;
PIVPERIODO_INICIAL := 201411;
PIVPERIODO_FINAL := NULL;
PIVPERIODO_EVENTO_INICIAL := NULL;
PIVPERIODO_EVENTO_FINAL := NULL;
PIVCUENTA := NULL;
PIVENTIDAD := NULL;
PIVMACRO := NULL;
PIVDEPENDENCIA := NULL;
PIVIDPARTIC := NULL;
PIVNIFCLIENTE := 'F03191871';
PIVNOMBCLIENTE := NULL;
PIVNIFGRUPO := NULL;
PIVNOMBGRUPO := NULL;
PIVCODA := NULL;
PIVDIFERIDA := '0';
PIVTI := '0';
PIVFILTROANULACION := 'T';
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
PINREG_INICIAL := 1001;
PINREG_FINAL := 2000;
XMLFINAL := NULL;
BDD_ACTIVOSEPAREP.PKG_CONSULTA_TRAZABILIDAD.BUSQUEDA ( PIVTABLA, PIVIFGD, PIVPERIODO_INICIAL, PIVPERIODO_FINAL, PIVPERIODO_EVENTO_INICIAL, PIVPERIODO_EVENTO_FINAL, PIVCUENTA, PIVENTIDAD, PIVMACRO, PIVDEPENDENCIA, PIVIDPARTIC, PIVNIFCLIENTE, PIVNOMBCLIENTE, PIVNIFGRUPO, PIVNOMBGRUPO, PIVCODA, PIVDIFERIDA, PIVTI, PIVFILTROANULACION, PIVORDEN_CAMPO, PIVORDEN_TIPO, PINREG_INICIAL, PINREG_FINAL, XMLFINAL );
COMMIT;
END;
感谢您的回复!
PD:ORA ERROR 中的第 46 行和第 47 行是
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
您必须对集合使用隐式构造函数,即代替
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
你应该写
PIVORDEN_CAMPO := BDD_ACTIVOSEPAREP.TORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := BDD_ACTIVOSEPAREP.TORDEN_CAMPO('D','D','D','A','D','D','A');
因为 BDD_ACTIVOSEPAREP.TORDEN_CAMPO()
是您的 BDD_ACTIVOSEPAREP.TORDEN_CAMPO
类型集合的隐式构造函数。
我在 TOAD 中调试带有两个 VARRAY 参数的程序时遇到了一些麻烦。我在我的数据库中定义了这个 VARRAY:
CREATE OR REPLACE TYPE BDD_ACTIVOSEPAREP.TORDEN_CAMPO as VARRAY(7) of VARCHAR2(13);
现在我想调试一个需要这个 varray 作为参数的程序,但是当我执行调试时出现这个错误:
ORA-06550: line 46, column 21: PLS-00316: PL/SQL TABLEs must use a single index
ORA-06550: line 46, column 3: PL/SQL: Statement ignored
ORA-06550: line 47, column 20: PLS-00316: PL/SQL TABLEs must use a single index
ORA-06550: line 47, column 3: PL/SQL: Statement ignored
这是我要执行的代码:
DECLARE
PIVTABLA VARCHAR2(32767);
PIVIFGD VARCHAR2(32767);
PIVPERIODO_INICIAL NUMBER;
PIVPERIODO_FINAL NUMBER;
PIVPERIODO_EVENTO_INICIAL NUMBER;
PIVPERIODO_EVENTO_FINAL NUMBER;
PIVCUENTA VARCHAR2(32767);
PIVENTIDAD VARCHAR2(32767);
PIVMACRO VARCHAR2(32767);
PIVDEPENDENCIA VARCHAR2(32767);
PIVIDPARTIC VARCHAR2(32767);
PIVNIFCLIENTE VARCHAR2(32767);
PIVNOMBCLIENTE VARCHAR2(32767);
PIVNIFGRUPO VARCHAR2(32767);
PIVNOMBGRUPO VARCHAR2(32767);
PIVCODA VARCHAR2(32767);
PIVDIFERIDA VARCHAR2(32767);
PIVTI VARCHAR2(32767);
PIVFILTROANULACION VARCHAR2(32767);
PIVORDEN_CAMPO BDD_ACTIVOSEPAREP.TORDEN_CAMPO;
PIVORDEN_TIPO BDD_ACTIVOSEPAREP.TORDEN_CAMPO;
PINREG_INICIAL NUMBER;
PINREG_FINAL NUMBER;
XMLFINAL XMLTYPE;
BEGIN
PIVTABLA := 'F01';
PIVIFGD := NULL;
PIVPERIODO_INICIAL := 201411;
PIVPERIODO_FINAL := NULL;
PIVPERIODO_EVENTO_INICIAL := NULL;
PIVPERIODO_EVENTO_FINAL := NULL;
PIVCUENTA := NULL;
PIVENTIDAD := NULL;
PIVMACRO := NULL;
PIVDEPENDENCIA := NULL;
PIVIDPARTIC := NULL;
PIVNIFCLIENTE := 'F03191871';
PIVNOMBCLIENTE := NULL;
PIVNIFGRUPO := NULL;
PIVNOMBGRUPO := NULL;
PIVCODA := NULL;
PIVDIFERIDA := '0';
PIVTI := '0';
PIVFILTROANULACION := 'T';
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
PINREG_INICIAL := 1001;
PINREG_FINAL := 2000;
XMLFINAL := NULL;
BDD_ACTIVOSEPAREP.PKG_CONSULTA_TRAZABILIDAD.BUSQUEDA ( PIVTABLA, PIVIFGD, PIVPERIODO_INICIAL, PIVPERIODO_FINAL, PIVPERIODO_EVENTO_INICIAL, PIVPERIODO_EVENTO_FINAL, PIVCUENTA, PIVENTIDAD, PIVMACRO, PIVDEPENDENCIA, PIVIDPARTIC, PIVNIFCLIENTE, PIVNOMBCLIENTE, PIVNIFGRUPO, PIVNOMBGRUPO, PIVCODA, PIVDIFERIDA, PIVTI, PIVFILTROANULACION, PIVORDEN_CAMPO, PIVORDEN_TIPO, PINREG_INICIAL, PINREG_FINAL, XMLFINAL );
COMMIT;
END;
感谢您的回复!
PD:ORA ERROR 中的第 46 行和第 47 行是
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
您必须对集合使用隐式构造函数,即代替
PIVORDEN_CAMPO := PIVORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := PIVORDEN_CAMPO('D','D','D','A','D','D','A');
你应该写
PIVORDEN_CAMPO := BDD_ACTIVOSEPAREP.TORDEN_CAMPO('F_REPOR','PREF','MREF','IFGD','ID_MOVIMIENTO','ID_GRUPO','CASO');
PIVORDEN_TIPO := BDD_ACTIVOSEPAREP.TORDEN_CAMPO('D','D','D','A','D','D','A');
因为 BDD_ACTIVOSEPAREP.TORDEN_CAMPO()
是您的 BDD_ACTIVOSEPAREP.TORDEN_CAMPO
类型集合的隐式构造函数。