不了解Oracle SQL中的存储过程

7xllpg7q  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(101)

我正在尝试创建一个没有参数和有参数的存储过程。
请帮助,我得到一个错误。

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;

字符串
不被理解

nzk0hqpo

nzk0hqpo1#

明显的错误是exception,它 * 在空间中丢失 *;它在这里做什么?你没有处理任何异常,所以-删除它。
另外,如果你直接使用了“datatype 1”和“datatype 2”,那是不起作用的。你必须指定有效的数据类型(比如number,varchar 2,等等)。
修复后,它可以工作(但-如果你想让我们 * 真正 * 帮助-考虑发布你使用的确切代码,沿着你得到的错误):

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>

相关问题