【问题标题】:Oracle database not recognizing type when using procedure使用过程时Oracle数据库无法识别类型
【发布时间】:2017-08-27 05:07:32
【问题描述】:

我在包头中声明了我的类型:

file_2.sql

CREATE OR REPLACE PACKAGE MY_UTILS
IS
TYPE VECTOR IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
TYPE MATRIX IS TABLE OF VECTOR INDEX BY PLS_INTEGER;
PROCEDURE PRINT_MATRIX(p_matrix IN MATRIX);
END MY_UTILS;

我的打印矩阵程序

PROCEDURE PRINT_MATRIX(p_matrix IN MATRIX)  IS
BEGIN
DBMS_OUTPUT.PUT_LINE('printing matrix..');
END PRINT_MATRIX;

PRINT_MATRIX 过程执行简单的DBMS_OUTPUT.PUT_LINE 来打印矩阵;当我尝试使用我的MY_UTILS.PRINT_MATRIX(v_matrix) 时,我得到了错误:

PLS-00306:调用中的参数数量或类型错误 'PRINT_MATRIX'

在我的另一个.sql 文件中,我还声明了与包中相同的 MATRIX 类型。

file_1.sql

set serveroutput ON;
DECLARE
TYPE VECTOR IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
TYPE MATRIX IS TABLE OF VECTOR INDEX BY PLS_INTEGER;
v_matrix MATRIX;
BEGIN
--populate matrix, printing it works with 2 FOR LOOPS
MY_UTILS.PRINT_MATRIX(v_matrix); -- error
END;

【问题讨论】:

  • 请发布您的PRINT_MATRIX 过程的样子,因为该错误与其调用时的错误参数类型有关(不是您在整个包或其他 sql 文件中声明的类型)
  • @Veverke 我只是将其重写为仅打印一个字符串,但仍然出现相同的错误。
  • @AlexPoole 我刚刚将 TYPE 声明从我的file_1.sql(我有一个匿名块)复制粘贴到我创建包的file_2.sql。 v_matrix 在匿名块中被声明为 MATRIX,就像我的问题的最后几行一样。

标签: sql database oracle plsql procedure


【解决方案1】:

Oracle 将您的变量视为与形式参数不同的类型。在您看来,它们看起来相同,向 Oracle 购买它们是两种不同的类型。

From the documentation:

包规范中定义的集合类型与相同定义的本地或独立集合类型不兼容。

因此,您必须更改变量声明以使用包中的类型:

DECLARE
  v_matrix MY_UTILS.MATRIX;
BEGIN
  --populate matrix, printing it works with 2 FOR LOOPS
  MY_UTILS.PRINT_MATRIX(v_matrix); -- error
END;

【讨论】:

  • 它有效。谢谢。我删除了另一个问题,因为它有 -2,我认为这个分数使它成为一个不必要/没有目的的问题。
猜你喜欢
  • 2019-10-30
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
相关资源
最近更新 更多