我们可以在一个PL / SQL块中使用多个函数吗?

时间:2016-01-31 09:53:30

标签: database oracle function plsql

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时执行第二部分。

3 个答案:

答案 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_intCREATE OR REPLACE FUNCTION ...,这样做可以满足您的需求。由于这两个在同一逻辑上下文中使用,您还可以创建一个包CREATE PACKAGE INTEREST并在此包中定义这两个函数。

然后,要求用户输入并实际使用这些功能,我建议您使用ACCEPT命令坚持使用sqlplus脚本,或者处理客户端应用程序中的所有内容(如果有的话)。

请参阅CREATE FUNCTIONCREATE PACKAGEsqlplus 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块中定义更多函数和过程。