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

Posted

技术标签:

【中文标题】PLS-00306:错误调用中的参数数量或类型错误【英文标题】:PLS-00306: wrong number or types of arguments in call to error 【发布时间】:2019-05-21 18:44:05 【问题描述】:

调用过程时出现此错误。我正在尝试做这个练习。

创建一个名为 find_region_and_currency 的过程来获取和返回一个国家所在的货币和地区。 将 COUNTRY_NAME 作为 IN 参数传递,并使用用户定义的记录作为 OUT 参数,返回国家名称、地区和货币。

我从这里尝试了旧答案,但我没有这样做。你能帮帮我吗?

CREATE OR REPLACE PACKAGE traveler_assistance_package
IS

TYPE country_rec IS RECORD (
    country_name COUNTRIES.COUNTRY_NAME%TYPE,
    region COUNTRIES.REGION_ID%TYPE,
    currency COUNTRIES.CURRENCY_CODE%TYPE);
PROCEDURE find_region_and_currency
(p_country_name   IN COUNTRIES.country_name%TYPE,
p_country_rec     OUT country_rec);
END traveler_assistance_package;
CREATE OR REPLACE package body traveler_assistance_package 
IS
PROCEDURE find_region_and_currency 
(p_country_name   IN countries.country_name%TYPE,
p_country_rec     OUT country_rec)
IS
BEGIN 
SELECT country_name, region_id, currency_code INTO p_country_rec
FROM COUNTRIES
where COUNTRY_NAME = p_country_name;
DBMS_OUTPUT.PUT_LINE('Country Name:'||p_country_rec.country_name ||  
  'Region:' || p_country_rec.region || 
  'Currency:' || p_country_rec.currency);
END;
END traveler_assistance_package;

【问题讨论】:

由于在您尝试调用该过程时会发生错误,因此显示执行调用的代码会很有帮助。 我正在调用这样的包裹“开始 traveler_assistance_package.find_region_and_currency('Republic of Bolivia'); end”,因为“Republic of Bolivia”是我的输入参数。然后我在调用“FIND_REGION_AND_CURRENCY”错误时得到错误数量或类型的参数。 嗯..这个过程有两个参数,你只传递一个。似乎错误的含义很清楚。 Littlefoot 的回答显示了如何使用两个参数调用过程的示例。 【参考方案1】:

您没有发布问题所在(代码的哪一部分);不管怎样,给你。

示例表:

SQL> create table countries
  2    (country_name    varchar2(20),
  3     region_id       varchar2(20),
  4     currency_code   varchar2(20));

Table created.

SQL> insert into countries values ('Croatia', 'A', 'kn');

1 row created.

包装:

SQL> CREATE OR REPLACE PACKAGE traveler_assistance_package
  2  IS
  3    TYPE country_rec IS RECORD (
  4      country_name COUNTRIES.COUNTRY_NAME%TYPE,
  5      region COUNTRIES.REGION_ID%TYPE,
  6      currency COUNTRIES.CURRENCY_CODE%TYPE);
  7    PROCEDURE find_region_and_currency
  8      (p_country_name   IN COUNTRIES.country_name%TYPE,
  9       p_country_rec     OUT country_rec);
 10  END traveler_assistance_package;
 11  /

Package created.

包体:

SQL> CREATE OR REPLACE package body traveler_assistance_package
  2  IS
  3    PROCEDURE find_region_and_currency
  4      (p_country_name   IN countries.country_name%TYPE,
  5       p_country_rec     OUT country_rec)
  6    IS
  7    BEGIN
  8      SELECT country_name, region_id, currency_code INTO p_country_rec
  9      FROM COUNTRIES
 10      where COUNTRY_NAME = p_country_name;
 11
 12      --dbms_output.put_line('Printing from FIND_REGION_AND_CURRENCY');
 13      --DBMS_OUTPUT.PUT_LINE('Country Name:'||p_country_rec.country_name ||
 14      --  ' Region:' || p_country_rec.region ||
 15      --  ' Currency:' || p_country_rec.currency);
 16    END;
 17  END traveler_assistance_package;
 18  /

Package body created.

测试:

SQL> set serveroutput on;
SQL> declare
  2    l_out traveler_assistance_package.country_rec;
  3  begin
  4    traveler_assistance_package.find_region_and_currency ('Croatia', l_out);
  5
  6    dbms_output.put_line('Printing from anonymous PL/SQL block');
  7    dbms_output.put_line(l_out.country_name ||', '|| l_out.currency);
  8  end;
  9  /
Printing from anonymous PL/SQL block
Croatia, kn

PL/SQL procedure successfully completed.

【讨论】:

像这样打电话 --> begin traveler_assistance_package.find_region_and_currency('Republic of Bolivia');然后我得到 ORA-06550: line 2, column 2: PLS-00306: wrong number or types of arguments in call to 'FIND_REGION_AND_CURRENCY' 当然。您声明它接受 两个 参数,但您只传递了一个(玻利维亚***)。您缺少 OUT 参数。 但我想用一个参数(玻利维亚***)调用并返回国家名称、地区和货币。这怎么可能?顺便说一句,谢谢你的帮助:) @ezgi:过程正在返回数据。只是,您似乎在拼命避免使用它。如您所见,Littlefoot 仅使用一个 IN 参数(玻利维亚***)调用它,并在 OUT 参数中获取所需的数据。如果由于某种原因您不想要 OUT 参数,则使该过程成为仅具有 IN 参数的函数并返回记录。然而,这并没有太大的区别。同样,您必须接受函数返回的内容。 事实是:您的作业说:“将 COUNTRY_NAME 作为 IN 参数传递,使用用户定义的记录作为 OUT 参数,返回国家名称等。”所以...顺便说一句,不客气。

以上是关于PLS-00306:错误调用中的参数数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06550:PLS-00306: 调用中的参数数量或类型错误;ORA-06550:

PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误

PLS-00306:调用“ADD_MONTHS”时参数的数量或类型错误

PLS-00306:调用“*”时参数的数量或类型错误

PLS-00306:调用“ABCINPUT”时参数的数量或类型错误

PLS-00306:调用 oracle 函数时参数的数量或类型错误