-- 输出功能
-- set serveroutput on size 10000DECLARE
-- 标量型变量 v_result NUMBER(8, 2); -- %TYPE会根据表中字段的类型定义变量 v_originName origin.originName%TYPE; v_constValue CONSTANT v_originName%TYPE := '这是一个常量'; -- 计数 v_num NUMBER(8) := 1; v_sum NUMBER(8) := 0;-- 复合型变量
-- 1)记录型 TYPE productinfo_rec IS RECORD ( pro_rec_productId productinfo.productId%TYPE, pro_rec_productName productinfo.productName%TYPE, pro_rec_productprice NUMBER(8, 2) ); v_productinfo productinfo_rec; -- 2)记录整行类型 v_productinfo2 productinfo%ROWTYPE; -- 3)索引表类型(类似map) -- table_name%ROWTYPE -- table_name.column_type%TYPE -- 标量类型 -- 相当于value的类型 TYPE productinfo_tab IS TABLE OF productinfo%ROWTYPE -- PLS_INTEGER -- BINARY_INTEGER -- VARCHAR2(v_size) -- 表示数组下标的数据类型,相当于key的类型 INDEX BY BINARY_INTEGER; v_productinfo_row productinfo_tab; -- 索引表类型之NUMBER-VARCHAR2 TYPE int_string_tab IS TABLE OF NUMBER(5, 2) INDEX BY VARCHAR2(20); v_int_string int_string_tab;BEGIN
-- 标量型变量 v_result := 100/6; dbms_output.put_line('结果为:' || v_result); select originName INTO v_originName from origin where originId = '1'; DBMS_OUTPUT.PUT_LINE('产品的地址为:' || v_originName); DBMS_OUTPUT.PUT_LINE('v_constValue:' || v_constValue);-- 复合型变量
-- 1)记录型 select productId, productName, productprice INTO v_productinfo from productinfo where productId = '1'; DBMS_OUTPUT.PUT_LINE('产品编号为(记录型输出):' || v_productinfo.pro_rec_productId); DBMS_OUTPUT.PUT_LINE('产品名称为(记录型输出):' || v_productinfo.pro_rec_productName); DBMS_OUTPUT.PUT_LINE('产品价格为(记录型输出):' || v_productinfo.pro_rec_productprice); -- 2)记录整行类型 select * INTO v_productinfo2 from productinfo where productId = '1'; DBMS_OUTPUT.PUT_LINE('产品产地为(整行类型输出):' || v_productinfo2.originId); -- 3)索引表类型 select * INTO v_productinfo_row(1) from productinfo where productId = '1'; DBMS_OUTPUT.PUT_LINE('产品名称为(索引表类型输出):' || v_productinfo_row(1).productName); -- 索引表类型之NUMBER-VARCHAR2 v_int_string('你好') := 3; v_int_string('Oracle') := 10; DBMS_OUTPUT.PUT_LINE('v_int_string(索引表类型输出):' || SQRT((v_int_string('Oracle')-v_int_string('你好'))**2));-- if判断
IF v_int_string('你好') > v_int_string('Oracle') THEN DBMS_OUTPUT.PUT_LINE('较大值为(if判断输出):' || v_int_string('你好')); ELSIF v_int_string('你好') < v_int_string('Oracle') THEN DBMS_OUTPUT.PUT_LINE('较大值为(if判断输出):' || v_int_string('Oracle')); ELSE DBMS_OUTPUT.PUT_LINE('较大值为(if判断输出): 相等'); END IF;-- case
case v_int_string('Oracle') WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('CASE -> 3'); WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('CASE -> 10'); END CASE;-- LOOP循环
<<loop_test>> LOOP v_num := v_num + 1; EXIT loop_test WHEN v_num > 5; END LOOP;-- 赋值
v_num := 1;<<while_loop>>
WHILE v_num <= 10 LOOP v_num := v_num + 1; END LOOP;-- 赋值
v_num := 1;<<for_loop>>
FOR v_num IN 1..100 LOOP v_sum := v_sum + v_num; END LOOP; DBMS_OUTPUT.PUT_LINE('1加到100的和为:' || v_sum);EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('没有对应的编号!'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('对应的数据过多!');END;
/----------------------------------------------------------------------------------------------------------------
PL/SQL DML DDL
DECLARE
v_createStudent varchar2(1000);BEGIN
insert into origin values('1', '刘观良'); COMMIT;v_createStudent := 'create table student
( studentId number(5), studentName varchar2(20), studentGender number(1) )'; EXECUTE IMMEDIATE v_createStudent; END; /----------------------------------------------------------------------------------------------------------------
PL/SQL函数
CREATE OR REPLACE FUNCTION LOW_PRICE(V_PRICE IN NUMBER)
RETURN VARCHAR2 IS V_RETURN VARCHAR2(20); BEGIN select productName into V_RETURN from productinfo where productprice = V_PRICE; RETURN V_RETURN; END; /select LOW_PRICE(9.9) from dual;
drop FUNCTION LOW_PRICE;----------------------------------------------------------------------------------------------------------------
存储过程
CREATE OR REPLACE PROCEDURE TESTPRO
AS BEGIN DBMS_OUTPUT.PUT_LINE('存储过程!!!'); END; /EXEC TESTPRO;
drop PROCEDURE TESTPRO;----------------------------------------------------------------------------------------------------------------
存储过程与存储函数的区别和联系 相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。 2.都是一次编译,多次执行。不同点:1.存储过程定义关键字用procedure,函数定义用function。
2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。
区别和联系来源:https://www.cnblogs.com/zlbx/p/4818007.html
----------------------------------------------------------------------------------------------------------------