Oracle SQL 中的存储过程不理解 [已关闭]

Not understood stored procedure in Oracle SQL [closed]

提问人:Harshad Mehta 提问时间:11/16/2023 最后编辑:marc_sHarshad Mehta 更新时间:11/16/2023 访问量:62

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

3天前关闭。

我正在尝试创建一个没有参数和参数的存储过程。

请帮忙,我遇到错误。

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;

不明白...

SQL Oracle 存储过程

评论

2赞 Shadow 11/16/2023
你得到什么错误?另外,您希望此存储过程做什么?
1赞 jarlh 11/16/2023
该程序的目的是什么?
1赞 Shadow 11/16/2023
如果您不告诉我们错误消息以及此存储过程的用途,我们将无法为您提供帮助。
1赞 jarlh 11/16/2023
不要在评论部分提供此类信息。请改为编辑您的问题。
1赞 jarlh 11/16/2023
该过程将金额添加到员工的manager_id列中。很奇怪。

答:

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
我已经在邮箱中添加了我的查询...请检查