DECLARE
avg_sal number(8,2);
c number(8);
total number(8,2);
at number(8);
a number(8);
rt number(8);
r number(8);
y number(8);
yr number(8);
c number(8);
ch number(8);
FUNCTION cmd_int(amt number,rate number,intrest number)
RETURN number
IS
cint number(8,2);
BEGIN
END;
FUNCTION smp_int(amt number,rate number,intrest number)
RETURN number
IS
sint number(8,2);
BEGIN
sint:=(amt*rate*intrest)/100;
return total/c;
END;
BEGIN
dbms_output.put_line('Enter amount :'||:a);
at:=:a;
dbms_output.put_line('Enter rate :'||:r);
rt:=r;
dbms_output.put_line('Enter year :'||:y);
yr:=y;
dbms_output.put_line('1 Compound Intrest');
dbms_output.put_line('2 Simple Intrest');
dbms_output.put_line('Enter your choice :'||:c);
ch:=c;
CASE
WHEN ch:=1 THEN
ci:=cmd_int(at,rt,yr);
dbms_output.put_line('Compound Intrest :'||ci);
WHEN ch:=2 THEN
si:=smp_int(at,rt,yr);
dbms_output.put_line('Simple Intrest :'||si);
END;
以上是我想要执行的代码,有两个函数cmd_int和smp_int,所以我能在一个PL / SQL块中执行多个函数吗?谢谢!
基本上我想在我的选择是1时执行第一部分,而在我的选择是2时执行第二部分。
答案 0 :(得分:2)
是的,您可以根据需要定义和调用任意数量的函数和过程(以及子块 - 最多不超过a limit)。如果你不能,那么PL / SQL的功能就会受到限制。
但其余代码必须有效。你是missing an end case
:
image.onload = function(){};
...
CASE
WHEN ch:=1 THEN
ci:=cmd_int(at,rt,yr);
dbms_output.put_line('Compound Intrest :'||ci);
WHEN ch:=2 THEN
si:=smp_int(at,rt,yr);
dbms_output.put_line('Simple Intrest :'||si);
END CASE;
END;
为a reserved word in PL/SQL,因此您无法拥有该名称的变量,您需要更改它。
您似乎也将PL / SQL局部变量(例如AT
)与绑定变量(r
)混淆,并且您尝试在块和用户之间进行交互,这是PL / SQL不是为...而设计的。一旦PL / SQL块有效,您的客户端将抱怨并非所有变量都被绑定,或者在执行块之前提示所有,并且您只会看到来自{的'prompt'字符串在块执行后<1}} 。
您的应用程序或客户端需要收集PL / SQL块之外的所有值; Michael Schaefers展示了SQL Developer或SQL * Plus的常用方法。如果这是您的任务的一部分,您仍然可以将它与PL / SQL块组合。
答案 1 :(得分:2)
从技术上回答标题的问题:是的,您可以在PL / SQL块中使用多个函数,如下面的示例代码所示:
set serveroutput on;
DECLARE
FUNCTION cmd_int(amt number,rate number,intrest number)
RETURN number
IS
cint number(8,2);
BEGIN
return 4;
END;
FUNCTION smp_int(amt number,rate number,intrest number)
RETURN number
IS
sint number(8,2);
BEGIN
return 5;
END;
BEGIN
dbms_output.put_line('Result 1: ' || cmd_int(1,2,3));
dbms_output.put_line('Result 2: ' || smp_int(1,2,3));
END;
/
执行此块将产生
Result 1: 4
Result 2: 5
现在问题:
我建议您通过cmd_int
创建两个单独的函数smp_int
和CREATE OR REPLACE FUNCTION ...
,这样做可以满足您的需求。由于这两个在同一逻辑上下文中使用,您还可以创建一个包CREATE PACKAGE INTEREST
并在此包中定义这两个函数。
然后,要求用户输入并实际使用这些功能,我建议您使用ACCEPT
命令坚持使用sqlplus脚本,或者处理客户端应用程序中的所有内容(如果有的话)。
请参阅CREATE FUNCTION,CREATE PACKAGE和sqlplus ACCEPT
上的Oracle文档记录sqlplus脚本的基本思想是
SET SERVEROUTPUT ON;
ACCEPT a NUMBER PROMPT 'Enter amount: ';
ACCEPT r NUMBER PROMPT 'Enter rate: ';
ACCEPT y NUMBER PROMPT 'Enter year: ';
ACCEPT c NUMBER PROMPT '1 Compount Interest, 2 Simple Interest: ';
SELECT CASE WHEN &&c = 1 THEN cmd_int(a,r,y) ELSE smp_int(a,r,y) END AS Interest FROM DUAL;
有关使用sqlplus的更多信息可以找到here
答案 2 :(得分:0)
是。您可以在pl / sql块中定义更多函数和过程。