Pl/Sql 过程中的 Oracle 函数
Pl/Sql Oracle Function in a procedure
我需要做一个程序,需要更新一个学生的情况,但是我需要使用一个函数,returns 'A' 用于批准的学生,并且 'R'对于未批准的。在此之后,我需要使用从函数返回的 'A' 或 'R' 更新字段 "Situation"。我已经有了这个功能,但我不知道如何制作这个程序。函数代码如下:
CREATE OR REPLACE FUNCTION check_grade(grade IN NUMBER,
frequency IN NUMBER) RETURN VARCHAR2 AS
RESULT VARCHAR2(1) DEFAULT '';
BEGIN
IF (grade >= 6) AND (frequency >= 0.75) THEN
resultado := 'A';
ELSE
resultado := 'R';
END IF;
RETURN RESULT;
END;
看看这是否有帮助。
create or replace procedure pr_update(v_grade in number, v_frequency in number) is
update tab_name set Situation=check_grade(v_grade,v_frequency);
end;
我认为你把事情复杂化了。您可以使用纯 SQL 而不是使用 PL/SQL 函数和过程。
您可以使用 CASE 表达式,例如:
测试 1
SQL> SELECT
2 CASE
3 WHEN &grade >=6
4 AND &frequency>=0.75
5 THEN 'A'
6 ELSE 'R'
7 END
8 FROM DUAL;
Enter value for grade: 10
old 3: WHEN &grade >=6
new 3: WHEN 10 >=6
Enter value for frequency: 1
old 4: AND &frequency>=0.75
new 4: AND 1>=0.75
C
-
A
测试 2
SQL> SELECT
2 CASE
3 WHEN &grade >=6
4 AND &frequency>=0.75
5 THEN 'A'
6 ELSE 'R'
7 END
8 FROM DUAL;
Enter value for grade: 1
old 3: WHEN &grade >=6
new 3: WHEN 1 >=6
Enter value for frequency: 0.5
old 4: AND &frequency>=0.75
new 4: AND 0.5>=0.75
C
-
R
因此,在您的 UPDATE 语句中使用相同的逻辑:
UPDATE table_name
SET situation = (
CASE
WHEN &grade >=6
AND &frequency>=0.75
THEN 'A'
ELSE 'R'
END)
WHERE situation IS NOT NULL;
更新 OP只想在一个过程中做:
create or replace procedure pr_update
is
begin
update table_name
set Situation = check_grade(grade, frequency);
end;
/
在上面的过程中,将实际的table_name放在更新语句中。等级和频率被视为 table.
的列名称
我需要做一个程序,需要更新一个学生的情况,但是我需要使用一个函数,returns 'A' 用于批准的学生,并且 'R'对于未批准的。在此之后,我需要使用从函数返回的 'A' 或 'R' 更新字段 "Situation"。我已经有了这个功能,但我不知道如何制作这个程序。函数代码如下:
CREATE OR REPLACE FUNCTION check_grade(grade IN NUMBER,
frequency IN NUMBER) RETURN VARCHAR2 AS
RESULT VARCHAR2(1) DEFAULT '';
BEGIN
IF (grade >= 6) AND (frequency >= 0.75) THEN
resultado := 'A';
ELSE
resultado := 'R';
END IF;
RETURN RESULT;
END;
看看这是否有帮助。
create or replace procedure pr_update(v_grade in number, v_frequency in number) is
update tab_name set Situation=check_grade(v_grade,v_frequency);
end;
我认为你把事情复杂化了。您可以使用纯 SQL 而不是使用 PL/SQL 函数和过程。
您可以使用 CASE 表达式,例如:
测试 1
SQL> SELECT
2 CASE
3 WHEN &grade >=6
4 AND &frequency>=0.75
5 THEN 'A'
6 ELSE 'R'
7 END
8 FROM DUAL;
Enter value for grade: 10
old 3: WHEN &grade >=6
new 3: WHEN 10 >=6
Enter value for frequency: 1
old 4: AND &frequency>=0.75
new 4: AND 1>=0.75
C
-
A
测试 2
SQL> SELECT
2 CASE
3 WHEN &grade >=6
4 AND &frequency>=0.75
5 THEN 'A'
6 ELSE 'R'
7 END
8 FROM DUAL;
Enter value for grade: 1
old 3: WHEN &grade >=6
new 3: WHEN 1 >=6
Enter value for frequency: 0.5
old 4: AND &frequency>=0.75
new 4: AND 0.5>=0.75
C
-
R
因此,在您的 UPDATE 语句中使用相同的逻辑:
UPDATE table_name
SET situation = (
CASE
WHEN &grade >=6
AND &frequency>=0.75
THEN 'A'
ELSE 'R'
END)
WHERE situation IS NOT NULL;
更新 OP只想在一个过程中做:
create or replace procedure pr_update
is
begin
update table_name
set Situation = check_grade(grade, frequency);
end;
/
在上面的过程中,将实际的table_name放在更新语句中。等级和频率被视为 table.
的列名称