plsql自学札记

plsql自学笔记
--PLSQL 存储过程

--问题:为何赋值没用
--不能修改输入参数 IN关键字
CREATE OR REPLACE PROCEDURE sp_hello(--建立存储过程
       p_name IN emp.ename%TYPE
)
AS
BEGIN
p_name:='hello,'||p_name;

END;

CALL sp_hello('lovo');

--解决方式一:建立临时变量
CREATE OR REPLACE PROCEDURE sp_hello(--建立存储过程
       p_name IN emp.ename%TYPE
)
AS
v_name VARCHAR2(20);
BEGIN
v_name:='hello,'||p_name;
dbms_output.put_line(v_name);
END;

CALL sp_hello('lovo');
--此句只能在命令里使用,记得设置set serveroutput on
--格式
set serveroutput on
EXEC sp_hello('lovo');

--输出结果:hello,lovo

--解决方式二:块中输出
--当块里使用时需注意,不能使用call
BEGIN
sp_hello('lovo');
END;


--插入:无参数过程
CREATE OR REPLACE PROCEDURE sp_hello--无参存储过程
AS
BEGIN
dbms_output.put_line('hello');
END;
--区别,不管是否有参数都要括号
CALL sp_hello();
CALL sp_hello;--错误

--命令行里,以下口令就全部正确,不管是否有括号
EXEC sp_hello();
EXEC sp_hello;


--OUT关键字
CREATE OR REPLACE PROCEDURE sp_hello(--存储过程
p_name OUT emp.ename%TYPE
)
AS
BEGIN
p_name:='hello,'||p_name;
END;

--需注意调用方式,必须用变量来接收输出变量
--结果只有hello,
DECLARE
v1 VARCHAR2(10);
BEGIN
v1:='lovo';
sp_hello(v1);
dbms_output.put_line(v1);
END;

--out参数不能输入值
--解决办法
--结果 hello,lovo
CREATE OR REPLACE PROCEDURE sp_hello(--存储过程
p_name_in IN emp.ename%TYPE,
p_name OUT emp.ename%TYPE
)
AS
BEGIN
p_name:='hello,'||p_name_in;
END;

--调用
--理解 V2相当于过程的返回值
DECLARE
v1 VARCHAR2(10);
v2 VARCHAR2(10);
BEGIN
v1:='lovo';
sp_hello(v1,v2);
dbms_output.put_line(v2);
END;


--IN OUT 一起使用
--最方便,何时使用需看情况说明
CREATE OR REPLACE PROCEDURE sp_hello(--存储过程
p_name IN OUT emp.ename%TYPE-- IN OUT
)
AS
BEGIN
p_name:='hello,'||p_name;
END;

--调用
DECLARE
v1 VARCHAR2(10);
BEGIN
v1:='lovo';
sp_hello(v1);
dbms_output.put_line(v1);
END;