确切的提取返回的数据超过了请求的行数(PL / SQL)

时间:2018-08-30 09:43:29

标签: plsql

这是我尝试过的代码

SET SERVEROUTPUT ON;
ACCEPT input_accountNumber NUMBER PROMPT 'Enter the account number : '
ACCEPT input_branch CHAR PROMPT 'Enter the branch : '

CREATE FUNCTION activeAccounts
RETURN NUMBER    IS
  accountNumber NUMBER;
BEGIN
  FOR rec IN (SELECT account_number, branch FROM ACCOUNT_DATA WHERE status='Active') 
  LOOP
    INSERT INTO ACTIVE_ACCOUNTS VALUES (rec.account_number,rec.branch);
  END LOOP;
END;
/

DECLARE
  accountStatus VARCHAR(20);
  inputuser_accountNumber NUMBER;
  inputuser_branch VARCHAR(20);
  cf varchar(20);
BEGIN
  inputuser_accountNumber := '&input_accountNumber';
  inputuser_branch := '&input_branch';
  SELECT status INTO accountStatus FROM ACCOUNT_DATA;
  IF (accountStatus = 'Active') THEN
    cf := activeAccounts();
  ELSE
    DBMS_OUTPUT.PUT_LINE('The account is Inactive.');
  END IF;
END;
/

问题陈述为

根据给定的要求在PL / SQL中编写存储的函数,并在PL / SQL中使用相同的函数 块。 户口号码。并且分支名称将被用户接受。相同的将被搜索 表acct_details。如果帐户状态为活动,则显示适当的消息以及 将帐户详细信息存储在active_acc_details表中,否则在屏幕上显示消息 “帐户无效”。

并且错误

  

错误报告-ORA-01422:确切的提取返回的请求量大于请求   行数

     

ORA-06512:在第9行

     
      
  1. 00000-“精确获取返回的行数超过了请求的行数”   *原因:精确提取中指定的数字小于返回的行。   *操作:重写查询或更改请求的行数
  2.   

2 个答案:

答案 0 :(得分:2)

您的代码中几乎没有可以纠正的缺陷,您的代码可以正常工作。首先根据您的问题陈述:

  

帐号并且分支名称将被用户接受。一样会   在表acct_details中进行搜索。

这意味着您的Select查询必须具有某种过滤条件才能选择用户输入的唯一记录。

此外,您的代码中无需包含函数,而过程将更适合。您需要以下内容:

--Passing the record to proc to store records to details table.
CREATE OR REPLACE PROCEDURE activeaccounts (v_acct_num number, v_brnch varchar2)
AS
BEGIN
    FOR rec IN (
        SELECT
            account_number,
            branch
        FROM
            account_data
        WHERE
            status = 'Active'
       and  acct_number =   v_acct_num
       And   branch = v_brnch)

    ) LOOP
        INSERT INTO active_accounts VALUES (
            rec.account_number,
            rec.branch
        );

    END LOOP;
END;
/

--Anonymous Block 
DECLARE
    accountstatus             VARCHAR(20);
    inputuser_accountnumber   NUMBER;
    inputuser_branch          VARCHAR(20);
    cf                        VARCHAR(20);
BEGIN
    inputuser_accountnumber := '&input_accountNumber';
    inputuser_branch        := '&input_branch';

    --As per your problem statement, your select statement must have account number and branch in where clause to pick one unique record.
    SELECT
        status
    INTO
        accountstatus
    FROM
        account_data
    Where acct_number =   inputuser_accountnumber;
    And   branch = inputuser_branch;

    IF
        ( accountstatus = 'Active' )
    THEN
       --Calling Proc to save records
       activeaccounts (inputuser_accountnumber,inputuser_branch);
    ELSE
        dbms_output.put_line('The account is Inactive.');
    END IF;

END;
/

答案 1 :(得分:2)

一个函数旨在在您需要执行某些操作时返回某些内容,而不返回任何内容,因此我将解释需求 作为“构建存储过程”。

现在,说您有您的过程,它只需要查找一些特定的帐户分支和编号,因此它将需要一些输入参数。 然后,此过程应检查表中的(唯一?)行以获取帐户的状态(根据分支机构和帐户的值使用WHERE条件进行选择)。 知道状态后,该过程只需打印一条消息或进行插入即可。

使用以下表格

create table ACCOUNT_DATA(account_number, branch, status) as (
    select 1, 'x', 'Active'   from dual union all
    select 2, 'x', 'Inactive' from dual 
)   

create table active_accounts (account_number number, branch varchar2(10))

您可以创建一个像这样的过程:

create or replace procedure checkAccount(p_acc_number IN number, p_acc_branch IN varchar2) is
    v_status varchar2(10);
begin
    -- get the status, assuming that the couple (account_number, and branch) is a key for the table 
    select status
    into v_status
    from ACCOUNT_DATA
    where account_number = p_acc_number
      and branch = p_acc_branch;
    -- check the status
    if v_status = 'Active' then
        insert into active_accounts
        values (p_acc_number, p_acc_branch);
    else
       dbms_output.put_line('The account is Inactive.');
    end if;
end;     

您的脚本可能是( test.sql ):

SET SERVEROUTPUT ON;
ACCEPT input_accountNumber NUMBER PROMPT 'Enter the account number : '
ACCEPT input_branch CHAR PROMPT 'Enter the branch : '

begin
    checkAccount('&input_accountNumber', '&input_branch');
end;    
/

工作原理:

SQL> select * from active_accounts;

no rows selected

SQL> sta d:\temp\test.sql
Enter the account number : 1
Enter the branch : x

PL/SQL procedure successfully completed.

SQL> sta d:\temp\test.sql
Enter the account number : 2
Enter the branch : x
The account is Inactive.

PL/SQL procedure successfully completed.

SQL> select * from active_accounts;

ACCOUNT_NUMBER BRANCH
-------------- ----------
             1 x

SQL>