Oracle存储过程和函数简单示例(二)

  • --存储过程基本语法结构,我在运行过程中,总会出现已在sql窗口建了某张表,但在命令窗口查询说不存在,
  • --主要问题在于用户切换导致的用户不同------
  1. DECLARE
  2.   v_ename emp.ename%TYPE;
  3. BEGIN
  4.   SELECT ename INTO v_ename FROM emp WHERE empno = &empno;
  5.   dbms_output.put_line('员工姓名:' || v_ename);
  6.   EXCEPTION
  7.     WHEN NO_DATA_FOUND 
  8.     THEN dbms_output.put_line('查无此人!');  
  9. END;
  • /**
  •     条件判断
  •     IF boolean THEN executable END IF;
  •     IF boolean THEN executable ELSE executable END IF;
  •     IF boolean THEN executable ELSIF boolean THEN executable ELSE executable END IF;  
  • */
  • /**
  •     循环 (LOOP WHILE FOR)
  • */
  • -- LOOP
  1. DECLARE
  2.    j NUMBER := 0;
  3. BEGIN
  4.    j := 1;
  5.    LOOP
  6.      dbms_output.put_line(j);
  7.      EXIT WHEN j >= 7;  
  8.      j := j + 1;
  9.    END LOOP;
  10. END;
  • -- WHILE
  1. DECLARE
  2.    j NUMBER := 0;
  3. BEGIN
  4.    j := 1;
  5.    WHILE j <= 8
  6.    LOOP
  7.        dbms_output.put_line(j || '---');
  8.        j := j+1;
  9.    END LOOP;
  10. END;
  • -- FOR
  1. DECLARE 
  2.   j NUMBER := 0;
  3. BEGIN
  4.   FOR j IN 1..8
  5.   LOOP
  6.     dbms_output.put_line(j || '---');
  7.   END LOOP;  
  8. END;
  • /**
  •    存储过程.PROCEDURE
  •    参数形式三种 (in, outm in out)
  • */
  • -- 示例一
  1. CREATE OR REPLACE PROCEDURE PROC1(i IN NUMBER)
  2. AS 
  3.  a VARCHAR2(50);
  4. BEGIN
  5.   a := '';
  6.   FOR j IN 1..i 
  7.   LOOP
  8.     a := a || '*';
  9.     dbms_output.put_line(a);
  10.   END LOOP;
  11. END;  
  • -- 两种方式调用存储过程 1 通过exec执行 2 通过块执行
  1.  exec PROC1(4);
  2. BEGIN
  3.   PROC1(7);
  4. END;
  5. ----------------------运行------------------------------------------
  6. SQL> CREATE OR REPLACE PROCEDURE PROC1(i IN NUMBER)
  7.   2  AS
  8.   3   a VARCHAR2(50);
  9.   4  BEGIN
  10.   5    a := '';
  11.   6    FOR j IN 1..i
  12.   7    LOOP
  13.   8      a := a || '*';
  14.   9      dbms_output.put_line(a);
  15.  10    END LOOP;
  16.  11  END;
  17.  12  /
  18. Procedure created
  19. SQL> 
  20. SQL> BEGIN
  21.   2    PROC1(7);
  22.   3  END;
  23.   4  /
  24. *
  25. **
  26. ***
  27. ****
  28. *****
  29. ******
  30. *******
  31. PL/SQL procedure successfully completed
  • --示例二
  1. CREATE OR REPLACE PROCEDURE PROC2(i OUT NUMBER)
  2. AS
  3. BEGIN
  4.   i := 100;
  5.   dbms_output.put_line(i);
  6. END;
  7. DECLARE
  8.  k NUMBER;
  9. BEGIN
  10.   PROC2(K);
  11.   dbms_output.put_line(k);
  12. END; 
  13. ----------------------------运行--------------------------------
  14. SQL> CREATE OR REPLACE PROCEDURE PROC2(i OUT NUMBER)
  15.   2  AS
  16.   3  BEGIN
  17.   4    i := 100;
  18.   5    dbms_output.put_line(i);
  19.   6  END;
  20.   7  /
  21. Procedure created
  22. SQL> 
  23. SQL> DECLARE
  24.   2   k NUMBER;
  25.   3  BEGIN
  26.   4    PROC2(K);
  27.   5    dbms_output.put_line(k);
  28.   6  END;
  29.   7  /
  30. 100
  31. 100
  32. PL/SQL procedure successfully completed
  • -- 示例三
  1. CREATE OR REPLACE PROCEDURE PROC3(p1 IN OUT NUMBER , p2 IN OUT NUMBER)
  2. AS
  3.   v_temp NUMBER;
  4. BEGIN
  5.   v_temp := p1;
  6.   p1 :=  p2;
  7.   p2 := v_temp;
  8. END;
  9. DECLARE 
  10. num1 NUMBER := 10; 
  11. num2 NUMBER := 20;
  12. BEGIN
  13.   PROC3(num1, num2);
  14.   dbms_output.put_line(num1); 
  15.   dbms_output.put_line(num2); 
  16. END;
  17. ------------------------------------------------------------------------------
  18. SQL> CREATE OR REPLACE PROCEDURE PROC3(p1 IN OUT NUMBER , p2 IN OUT NUMBER)
  19.   2  AS
  20.   3    v_temp NUMBER;
  21.   4  BEGIN
  22.   5    v_temp := p1;
  23.   6    p1 :=  p2;
  24.   7    p2 := v_temp;
  25.   8  END;
  26.   9  /
  27. Procedure created
  28. SQL> 
  29. SQL> DECLARE
  30.   2  num1 NUMBER := 10;
  31.   3  num2 NUMBER := 20;
  32.   4  BEGIN
  33.   5    PROC3(num1, num2);
  34.   6    dbms_output.put_line(num1);
  35.   7    dbms_output.put_line(num2);
  36.   8  END;
  37.   9  /
  38. 20
  39. 10
  40. PL/SQL procedure successfully completed

--函数--

  • /**
  •      函数:(函数是可以返回值的命名的PL/SQL 子程序)
  •      CREATE [OR REPLACE] FUNCTION <FUNCTION NAME> [(PARAM...)]
  •      RETURN <DATATYPE> IS|AS 
  •      [LOCAL DECLARATIONS]
  •      BEGIN
  •        EXECUTABLE STATEMENTS;
  •        RETURN RESULT;
  •        EXCEPTION 
  •          EXCEPTION HANDLERS; 
  •      END;
  • */
  • -- 001 要求:创建一个函数,可以接受用户输入的学号,得到该学生的名次,输出名次。
  1. drop table STUDENT;
  2. CREATE TABLE STUDENT (STU_NO NUMBER(3), NAME VARCHAR2(10), SCORE NUMBER(3));
  3. INSERT INTO STUDENT VALUES (1 , '小小', 99);
  4. INSERT INTO STUDENT VALUES (2 , '小G',  80);
  5. INSERT INTO STUDENT VALUES (3 , '诺诺', 98);
  6. INSERT INTO STUDENT VALUES (4 , '小北', 79);
  7. COMMIT;
  8. SELECT * FROM STUDENT;
  9. CREATE OR REPLACE FUNCTION FUNC1(SNO INT) RETURN INT
  10. AS
  11.  v_score NUMBER;
  12.  v_mingci NUMBER;
  13. BEGIN
  14.  SELECT SCORE INTO v_score FROM STUDENT WHERE STU_NO = SNO;
  15.  SELECT COUNT(*) INTO v_mingci FROM STUDENT WHERE SCORE > v_score;
  16.  v_mingci := v_mingci + 1;
  17.  RETURN v_mingci;
  18. END;
  19. SELECT FUNC1(3) FROM DUAL;
  20. --------------------------运行---------------------------------------------
  21. SQL> CREATE OR REPLACE FUNCTION FUNC1(SNO INT) RETURN INT
  22.   2  AS
  23.   3   v_score NUMBER;
  24.   4   v_mingci NUMBER;
  25.   5  BEGIN
  26.   6   SELECT SCORE INTO v_score FROM STUDENT WHERE STU_NO = SNO;
  27.   7   SELECT COUNT(*) INTO v_mingci FROM STUDENT WHERE SCORE > v_score;
  28.   8   v_mingci := v_mingci + 1;
  29.   9   RETURN v_mingci;
  30.  10  END;
  31.  11  /
  32. Function created
  33. SQL> SELECT FUNC1(3) FROM DUAL;
  34.   FUNC1(3)
  35. ----------
  36.          2

猜你喜欢

转载自blog.csdn.net/yangyang222222222/article/details/83544001