相信很多博友使用过oracle数据库,不管是工作还是日常学习,今天给大家分享一些oracle编程技巧,涉及到条件IFELSE、循环LOOP、游标CURSOR、存储过程PROCEDURE,函数FUNCTION,希望能帮到各位。
在PL/SQL中,IF、THEN、ELSE、ELSIF和ENDIF等关键字用于执行条件逻辑:
语法:
IF condition1 THEN
statement1
ELSIF condition2 THEN
statement2
ELSE
statement3
END IF;
condition表示条件,statement表示结果。
在PL/SQL中三种循环:一、简单循环;二、while循环;三、for循环:
简单循环语法:
LOOP
statement
END LOOP;
while循环语法:
while condition1 LOOP
statement
END LOOP;
在PL/SQL中,可以使用游标来获取查询结果,使用游标一般遵循5个步骤:
(1)声明变量,用于保存记录的列值;
(2)生命游标,并指定查询;
(3)打开游标;
(4)一次从游标中获取一个记录,并将列值储存在(1)声明的变量中;
(5)关闭游标。
语法和实例:
set serveroutput on
--声明变量--
declare
v_userId FS_PT_YW_BASE_USER.I_USERID%TYPE;
v_username FS_PT_YW_BASE_USER.C_USERNAME%TYPE;
v_userRealName FS_PT_YW_BASE_USER.C_USEREALNAME%TYPE;
--定义游标--
CURSOR cursor_baseUser is select I_USERID,C_USERNAME,C_USEREALNAME from fs_pt_yw_base_user;
begin
--打开游标--
open cursor_baseUser;
--从游标中获取记录--
loop
fetch cursor_baseUser into v_userId,v_username,v_userRealName;
EXIT WHEN cursor_baseUser%NOTFOUND;
Dbms_Output.put_line(
'v_userId=' || v_userId || ',v_username=' || v_username || ',v_userRealName=' || v_userRealName
);
END loop;
--关闭游标--
close cursor_baseUser;
END;
有的时候我们想要获取查询结果,有可能要传参数查询,这样视图可能满足不了我们的需求,我们可以使用存储过程procedure来帮助我们:
语法与实例:
CREATE OR REPLACE procedure "GET_TEST"(
whereValue1 IN VARCHAR2,
whereValue2 IN VARCHAR2,
p_cur out sys_refcursor)
AS
begin
if (whereValue2 IS NULL OR whereValue2 = '' OR whereValue2 = '430000') then
open p_cur for
SELECT
*
FROM
tabA
elsif length(whereValue2)=6 AND substr(whereValue2,4,6) = '00' then
open p_cur for
SELECT
*
FROM
tabB
else
open p_cur for
SELECT
*
FROM
tabC
end if;
end GET_TEST;
PL/SQL中也可以自定义函数使用FUNCTION:
语法与实例:
CREATE OR REPLACE function GET_COUNTRESULT(vfieldname in varchar2,vtablename in varchar2,vWhereString IN varchar2)
return number is
item_cjvalue number(20);
v_sql varchar2(200);
begin
IF (vWhereString IS NOT NULL)
THEN
v_sql := 'select count(' || vfieldname || ') from ' || vtablename || ' where ' || vWhereString;
ELSE
v_sql := 'select count(' || vfieldname || ') from ' || vtablename;
END IF;
execute immediate v_sql into item_cjvalue ;
return item_cjvalue ;
end GET_COUNTRESULT;