以下代码保存在名为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" ......线路无休止。
答案 0 :(得分:2)
创建程序/功能与匿名阻止
存储的程序/功能始终以创建或替换... 开头,以END结尾;
CREATE OR REPLACE用作存储函数和过程的隐式声明,因此您不必再在块内写入DECLARE
匿名阻止以 DECLARE 开头,以 END结尾;
结束
至于proc1.sql中保存的代码/代码块。
尝试此块:
-- 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过程。