oracle - 如何使用 VARRAY 参数调试存储过程?

标签 oracle debugging plsql toad varray

我在 TOAD 中调试带有两个 VARRAY 参数的程序时遇到了一些麻烦。我在数据库中定义了这个 VARRAY:

CREATE OR REPLACE TYPE BDD_ACTIVOSEPAREP.TORDEN_CAMPO as VARRAY(7) of VARCHAR2(13);

现在我想调试一个需要此变量作为参数的过程,但是当我执行调试时出现此错误:

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 类型集合的隐式构造函数。

关于oracle - 如何使用 VARRAY 参数调试存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870146/

相关文章:

Oracle 尝试更新列

oracle - PL/SQL : Procedures Successful with compilation error

debugging - 编写Kotlin代码时无法在IntelliJ IDEA中停止

python - 3.4.2 中的 asyncio 问题 - 它只是由于某种原因终止

java - 使用 PL/SQL 生成 SPSS 文件

SQL ORACLE 将两个查询连接在一起?

sql - 记录之间的时间差

php - 在 Yii 中调试 SQL 查询。 CFileLogRoute 与 CWebLogRoute

database - 从 Oracle 11g 中给定的 url 下载文件并将其保存到 blob 类型列中的过程

oracle - PL/SQL 函数返回无值