这是我尝试过的代码
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行
- 00000-“精确获取返回的行数超过了请求的行数” *原因:精确提取中指定的数字小于返回的行。 *操作:重写查询或更改请求的行数
答案 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>