pL / SQL PROCEDURE
这是一个过程的代码,它将术语,lineno,组件名称,学生ID,分数作为输入并处理学生分数。
如果没有例外,该程序应将分数添加到分数表中。
CREATE OR REPLACE PROCEDURE score_details
(aterm IN scores.Term%type,
alineno IN scores.Lineno%type,
acompname IN scores.Compname%type,
asid IN scores.sid%type,
apoints IN scores.points%type)
AS sterm scores.Term%type;
slineno scores.Lineno%type;
scompname scores.compname%type;
ssid scores.sid%type;
spoints scores.points%type;
BEGIN
SELECT term,lineno,compname,sid,points
INTO sterm,slineno,scompname,ssid,spoints
FROM scores
WHERE aterm=term AND alineno=Lineno AND acompname=compname AND asid=sid AND apoints=points;
EXCEPTION
when no_data_found THEN
dbms_output.put_line('Invalid details');
以下是用于测试上述过程的匿名块的代码。
我无法得到正确的结果。请帮我解释一下代码。
ACCEPT prompt 'pterm','plineno','pcompname','psid','ppoints'
DECLARE pterm scores.Term%type;
plineno scores.Lineno%type;
pcompname scores.Compname%type;
psid scores.sid%type;
ppoints scores.points%type;
BEGIN
score_details(pterm,plineno,pcompname,psid,ppoints);
END
答案 0 :(得分:2)
我将假设你故意错过了存储过程的大部分内容,因为它从表中取出一些值到一些局部变量中,然后对这些值没有任何作用。
我猜你在想知道为什么你在ACCEPT
行中输入的值没有进入存储过程调用。
ACCEPT
是一个SQL * Plus语句,可用于设置替换变量。以下示例创建名为colour
的替换变量并显示结果。我输入了 Yellow
行:
SQL> ACCEPT &colour Yellow SQL> PROMPT Your favourite colour is &colour Your favourite colour is Yellow
您还可以提示用户澄清您的要求:
SQL> ACCEPT colour PROMPT 'Enter a colour > ' Enter a colour > Yellow
并且您还可以在SQL中使用替换变量:
SQL> select '&colour' from dual; old 1: select '&colour' from dual new 1: select 'Yellow' from dual 'YELLO ------ Yellow
目前看来你的PL / SQL块有两件事情不太正确:
您的ACCEPT
声明无效。你还没有完全正确的部分顺序(如果使用,PROMPT
必须在变量名之后)。另外,我认为您不能在一个ACCEPT
中设置多个替换变量。
您没有使用包含输入值的替换变量。
因此,我想你想要对PL / SQL块的调用看起来更像下面这样:
ACCEPT pterm PROMPT 'Enter a term > '
ACCEPT plineno PROMPT 'Enter a line number > '
-- and similarly for the others.
DECLARE
pterm scores.Term%type := '&pterm';
plineno scores.Lineno%type := '&plineno';
pcompname scores.Compname%type := '&pcompname';
psid scores.sid%type := '&psid';
ppoints scores.points%type := '&ppoints';
BEGIN
score_details(pterm,plineno,pcompname,psid,ppoints);
END;