迟到者追赶并不容易
对于技术工作尤其如此。这都是一个有个人输入的过程。尤其是开发仍然是一个技术壁垒较高的行业。
创建基本存储过程
1 创建或替换过程 MyProName IS
2 开始
3 空;
4结束;
第1行:CREATE OR REPLACE PROCEDURE是一条SQL语句,通知Oracle数据库创建一个称为骨架的存储过程,如果存在则覆盖它;
第 2 行:IS 关键字表示后面将是 PL/SQL 主体。
第 3 行:BEGIN 关键字指示 PL/SQL 主体的开始。
第 4 行:NULL PL/SQL 语句表示不执行任何操作。这句话不能删除,因为PL/SQL体中至少需要有一句话;
第 5 行:END 关键字表示 PL/SQL 主体的结束
现在我想向存储过程添加参数。如何定义变量?如下
1 创建或替换过程 MyPro(param1 in varchar2,param2 out varchar2) as 2 v_cnt 号; --定义变量1 3 表名1 varchar2(80); --定义变量2 4 sqlTxt varchar2(2000); --定义变量2 5 开始 6 --处理逻辑 7 空; 8结束;
(1)存储过程参数没有取值范围,in表示传入,out表示输出;该类型可以使用Oracle中任何合法的类型。
(2) 变量有取值范围,后跟分号
返回顶部
创建或替换过程 MyPro(param1 in varchar2,param2 out varchar2) asv_cnt number; --定义变量1表名1 varchar2(80); --定义变量2sqlTxt varchar2(2000); --定义变量2 BEGIN--处理逻辑 NULL;commit;--提交事务 Exception当其他时候Dbms_output.Put_line(sqlerrm);--打印输出错误 Rollback;--回滚事务 结束;
提交交易,出现异常则回滚交易;
返回顶部
光标遍历
创建或替换过程 MyPro(param1 in varchar2, param2 out varchar2) asv_cnt number; --定义变量1表名1 varchar2(80); --定义变量2sqlTxt varchar2(2000); --定义变量2 BEGIN--定义游标cursor c_tab_temp1 isselect t.modelnumber, t.tablename from d_modelmap t;c_bom_row1 c_tab_temp1%rowtype;--处理逻辑--循环游标for c_bom_row1 in c_tab_temp1 Looptablename1 := c_bom_row1.tablename; --获取游标中的值END LOOP;commit; --提交交易 异常时其他人则Dbms_output.Put_line(sqlerrm); --打印输出错误回滚; --回滚事务 结束;
返回光标
创建或替换程序测试( 解析 varchar2,p_cur 输出 sys_refcursor) 作为 开始 打开 p_cur forselect * from tableName 资源:=''; 结束;
返回顶部
--分支判断 if tablename1 <> '' then--处理逻辑 null;else--处理逻辑 null;end if;
--拼接动态sqlsqltxt := 'update ' ||表名1 || ' tset t.partid=(从 i_partlist t3 中选择 t3.f_id,其中 t3.part_no=t.part_noand nvl(t3.part_techstate,'' '' )=nvl(t.part_techstate,'' ''))where 不存在( select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)';--执行动态sql执行立即sqlTxt;
(1) 使用 select XX into xx 给变量赋值
从 A t 中选择 count(1) 到 v_count,其中 t.A='aaa';
(2) 直接分配
V_TEST := 123;
WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;
在判断语句之前,最好先用count(*)函数判断操作记录是否存在
--判断是否存在,v_count是一个定义的数值变量 select count(1)into v_countfrom A twhere t.A='aaa';if v_count = 0 thenelseend if;