流程控制
1. IF
IF 条件 THEN
ELSE
END IF;
2. CASE
CASE '&grade'
WHEN ’A’ THEN DBMS_OUTPUT.PUT_LINE(’优异’);
WHEN ’B’ THEN DBMS_OUTPUT.PUT_LINE (优秀’);
3. 循环控制
3.1 LOOP 循环
/* 无条件循环 */
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
LOOP
INSERT INTO temp_table VALUES (v_Counter, 'Loop index');
v_Counter := v_Counter + 1;
IF v_Counter > 50 THEN
EXIT;
END IF;
END LOOP;
END;
3.2 WHILE 循环
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
WHILE v_Counter <= 50 LOOP
INSERT INTO temp_table VALUES (v_Counter, 'Loop index');
v_Counter := v_Counter + 1;
END LOOP;
END;
3.3 for条件循环
DECLARE
v_Counter NUMBER := 7;
BEGIN
FOR v_Counter IN 20..30 LOOP
INSERT INTO temp_table (num_col) VALUES (v_Counter);
END LOOP;
END;
4. 顺序控制
4.1 GOTO 语句
DECLARE
...
BEGIN
...
GOTO updation;
...
<<updation>>
END;
4.2 NULL 语句
SQL块结构
SET SERVEROUTPUT ON 在块中使用传递参数:&nCount
DECLARE 声明
...
BEGIN 执行部分
...
EXCEPTION 异常处理部分
...
END;
匿名块
[DECLARE]
BEGIN
[EXCEPTION]
END;
存储过程
IN
用于接受调用程序的值
OUT
用于向调用程序返回值
IN OUT
用于接受调用程序的值,并向调用程序返回更新的值
将过程的执行权限授予其他用户:
SQL> GRANT EXECUTE ON find_emp TO MARTIN;
SQL> GRANT EXECUTE ON swap TO PUBLIC;
---------------------------------------
CREATE OR REPLACE PROCEDURE find_emp(item_code IN VARCHAR2)
AS
BEGIN
[EXCEPTION]
END find_emp;
函数
函数只能接受 IN 参数,而不能接受 IN OUT 或 OUT 参数
形参不能是 PL/SQL 类型
函数的返回类型也必须是数据库类型
必须在规格说明中包含 RETURN 子句
-----------------------------------
FUNCTION name RETURN fun_datatype
IS
BEGIN
...
[EXCEPTION]
...
END;
-----------------------------------
函数调用
SELECT fun_datatype FROM DUAL
nType := fun_datatype