PL/SQL包含三个部分:定义(DECLARE)、执行(BEGIN…END)、异常处理(EXCEPTION)
1) 包含执行部分的PL/SQL块
SET SERVEROUPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE(‘hello!’);
END;
如果不设置SERVEROUTPUT则只提示PL/SQL过程成功完成,并没有输出hello!
2) 包含定义和执行部分的PL/SQL块
SET VERIFY OFF;
SET SERVEROUTPUT ON
DECLARE
v_name VARCHAR(30);
BEGIN
SELECT name INTO v_name FROM student WHERE id = &no;
DBMS_OUTPUT.PUT_LINE(‘姓名:’||v_name);
END;
通过设置VERIFY,可以设置是否列出包含替代变量的文本
SET VERIFY OFF;
SET VERIFY ON;
3) 完整的PL/SQL块
SET VERIFRY OFF;
SET SERVEROUTPUT ON;
DECLARE
v_name VARCHAR(30);
BEGIN
SELECT name INTO v_name FROM student WHERE id = &no;
DBMS_OUTPUT.PUT_LINE(‘姓名:’||v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘该编号不存在!’);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE(‘该编号所对应的行不唯一!’);
END;
4) PL/SQL过程
PL/SQL块一般被划分为匿名块、命名块、子程序、触发器
CREATE PROCEDURE update_tables(v_id INT,v_name varchar2)
IS
BEGIN
UPDATE student SET id = v_id WHERE LOWER(name) = LOWER(v_name);
END;
/
EXEC update_tables(3,’LY’);
这里是存储过程修改学生ID的,但是在我的电脑上,我执行存储过程之后再查看,发现什么都没有变,但是,如果我是改名字的,就会变,为嘛捏?
因为我的表是设置了ID自动增长的,所以,你改了它也不会理你的
5) PL/SQL函数
CREATE FUNCTION modify_id(v_name VARCHAR2) RETURN INT IS m_id INT;
BEGIN
SELECT id*5 INTO m_id FROM stu WHERE name = v_name;
RETURN m_id;
END;
当执行SELECT modify_id(‘A’) FROM dual;
就会有对应的返回值,不过很奇怪,我不知道dual是什么表……在这里即使是把表改成别的表显示出来的貌似是米虾米变化的(只要不是不存在的表就OK),并且对于原表是不会有任何影响的
在创建函数时,必须要有返回值