从另一个过程调用一个过程

时间:2015-10-04 18:26:44

标签: oracle stored-procedures plsql

以下代码保存在名为proc1.sql

的文件中
DECLARE
    B VARCHAR2(25);
    C NUMBER;

PROCEDURE Get_manager_detailS(NO IN NUMBER,NAME OUT VARCHAR2,SAL1 OUT NUMBER)
IS
BEGIN
    SELECT ENAME, SAL 
    INTO NAME, SAL1 
    FROM EMP 
    WHERE EMPNO = NO;
END;
BEGIN
Get_manager_detailS(7900,B,C);
DBMS_OUTPUT.PUT_LINE(B);
DBMS_OUTPUT.PUT_LINE(C);
END;
/

此过程存储在另一个文件proc3.sql

PROCEDURE Test_Procedure()
IS
BEGIN
b varchar2(25);
c number;
DBMS_OUTPUT.PUT_LINE('CALLING');
 Get_manager_details(7900,b,c);
END;

当我在sqlplus中运行它时,它显示错误

  

SP2-0734未知的命令开始程序。忽略了线条的忽视。   SP2-0042 UNKNOWN COMMAND" IS" ......线路无休止。

3 个答案:

答案 0 :(得分:2)

创建程序/功能与匿名阻止

  •   

    存储的程序/功能始终以创建或替换... 开头,以END结尾;

         

    CREATE OR REPLACE用作存储函数和过程的隐式声明,因此您不必再在块内写入DECLARE

  •   

    匿名阻止以 DECLARE 开头,以 END结尾;

    结束

至于proc1.sql中保存的代码/代码块。

  • 你的声明是错误的。你应该在结束后放置 程序
  • 使用CREATE OR REPLACE PROCEDURE启动程序

尝试此块:

    -- DECLARE              
    -- B VARCHAR2(25);
    -- C NUMBER;

    CREATE OR REPLACE PROCEDURE Get_manager_detailS(NO IN NUMBER,
                                                     NAME OUT VARCHAR2,
                                                     SAL1 OUT NUMBER)
    IS
    BEGIN
        SELECT ENAME, SAL 
        INTO NAME, SAL1 
        FROM EMP 
            WHERE EMPNO = NO;
    END; -- end of procedure

    /

    DECLARE --  start of anonymous block              
      B VARCHAR2(25);
      C NUMBER;
    BEGIN
      Get_manager_detailS(7900,B,C);
      DBMS_OUTPUT.PUT_LINE(B);
      DBMS_OUTPUT.PUT_LINE(C);
    END;

至于将调用get_manager_details过程的过程。它将与匿名块相同,唯一的区别是它存储

基于你已经完成的事情

  •   

    如果您不在程序中声明参数,则不需要括号,因此请将其删除。

  •   

    如果您没有可以捕获过程结果的输出参数,则可以使用dbms_output.put_line   

    上面的匿名区块
  •   

    变量声明应该在IS关键字之后和BEGIN语句之前完成,因为正如我在上面提到的那样 CREATE OR   REPLACE ... IS 是存储函数的隐式声明   程序

尝试这个:

    CREATE OR REPLACE PROCEDURE Test_Procedure
    IS -- always start with CREATE OR REPLACE
      b varchar2(25);
      c number;

    BEGIN
  --  b varchar2(25); misplaced declarations
  --  c number;
       DBMS_OUTPUT.PUT_LINE('CALLING');
       Get_manager_details(7900,b,c);
       DBMS_OUTPUT.PUT_LINE(B); -- displays the results b
       DBMS_OUTPUT.PUT_LINE(C); -- and c

    END;

很抱歉这篇长篇文章。

希望这有助于此。

CHEERS

答案 1 :(得分:1)

您的第一个块是匿名块,您在其中声明过程 - 您只能在匿名块内调用过程Get_manager_details。您无法从Get_manager_details致电Test_Procedure,因为没有此类程序。您需要先创建程序Get_manager_details

Create or replace procedure Get_manager_details ....

然后你可以运行

Create or replace procedure Test_Procedure ....

或者它不会编译。

答案 2 :(得分:-1)

如果您尝试在test_procedure中调用get_manager_details过程,则首先需要创建测试过程。 添加创建或替换过程test_procedure。 然后在创建test_procedure之后,您可以在匿名块中执行它,该块将调用get_manager_details过程。