提问人:Harshad Mehta 提问时间:11/16/2023 最后编辑:marc_sHarshad Mehta 更新时间:11/16/2023 访问量:62
Oracle SQL 中的存储过程不理解 [已关闭]
Not understood stored procedure in Oracle SQL [closed]
问:
我正在尝试创建一个没有参数和参数的存储过程。
请帮忙,我遇到错误。
create or replace procedure
raise_salary(e in number,amount in number,s out number)
is
begin
update emp
set manager_id = manager_id + amount
where EMPLOYEE = e;
commit;
select manager_id into s
from emp
where EMPLOYEE = e;
end;
/
variable kl;
execute RAISE_SALARY(2,2,:kl);
print :kl
exec RAISE_SALARY;
不明白...
答:
3赞
Littlefoot
11/16/2023
#1
明显的错误是在空间中丢失;它在这里做什么?您没有处理任何异常,因此 - 删除它。exception
此外,如果您从字面上使用了“datatype1”和“datatype2”,那将不起作用。您必须指定有效的数据类型(例如 number、varchar2 等)。
修复后,它可以工作(有点,但是 - 如果您希望我们真正提供帮助 - 请考虑发布您使用的确切代码,以及您遇到的错误):
SQL> CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN NUMBER,
2 parameter2 OUT VARCHAR2)
3 AS
4 -- Declaration section (optional): Declare local variables here
5 variable1 NUMBER := 10;
6 BEGIN
7 parameter2 := variable1;
8 END procedure_name;
9 /
Procedure created.
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 l_out VARCHAR2 (20);
3 BEGIN
4 procedure_name (10, l_out);
5 DBMS_OUTPUT.put_line ('Out parameter = ' || l_out);
6 END;
7 /
Out parameter = 10
PL/SQL procedure successfully completed.
SQL>
不带任何参数的过程:
SQL> create or replace procedure procedure_name is
2 begin
3 null;
4 end;
5 /
Procedure created.
SQL>
[编辑],基于您在编辑的问题中发布的代码。好吧,这没有多大意义。您应该更新薪水,而不是经理的 ID。
示例表:
SQL> SELECT * FROM temp;
EMPLOYEE MANAGER_ID SALARY
---------- ---------- ----------
7782 7839 2450
7839 5000
7934 7782 1300
您的程序,已修复;尝试为参数指定有意义的名称(阅读 PL/SQL 中的最佳实践)。
SQL> CREATE OR REPLACE PROCEDURE raise_salary (i_employee IN NUMBER,
2 i_amount IN NUMBER,
3 o_manager_id OUT NUMBER)
4 IS
5 BEGIN
6 UPDATE temp
7 SET salary = salary + i_amount
8 WHERE EMPLOYEE = i_employee;
9
10 SELECT manager_id
11 INTO o_manager_id
12 FROM temp
13 WHERE EMPLOYEE = i_employee;
14 END;
15 /
Procedure created.
在 SQL*Plus 中进行测试:
SQL> var k1 number
SQL> exec raise_salary(7782, 200, :k1);
PL/SQL procedure successfully completed.
SQL> print :k1
K1
----------
7839
SQL> select * from temp where employee = 7782;
EMPLOYEE MANAGER_ID SALARY
---------- ---------- ----------
7782 7839 2650 --> salary has been raised by 200
SQL>
评论
0赞
Harshad Mehta
11/16/2023
你能分享一些与没有参数和有参数相关的例子吗?
0赞
Littlefoot
11/16/2023
确定;我编辑了答案并添加了没有参数的程序。它(程序)什么都不做,但是 - 这就是它的样子。
0赞
Harshad Mehta
11/16/2023
是的,明白了。如果可能的话,你能给我分享两到三个有参数和没有参数的例子吗?
0赞
Littlefoot
11/16/2023
你已经有了这两个例子。你想解决什么问题?我不知道你在寻找什么样的例子。互联网上充斥着带有(或不带有)参数的 PL/SQL 过程。
0赞
Harshad Mehta
11/16/2023
我已经在邮箱中添加了我的查询...请检查
评论