oracle的PLSQL基础

前端之家收集整理的这篇文章主要介绍了oracle的PLSQL基础前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 1. PL/sql
  2. 1.1 PL/sql中的类型
  3. a)标量类型(数字,字符,日期,布尔)
  4. 类型名 sql中的范围 PL/sql中的范围
  5. char 1...2000 1...32767
  6. varchar2 1...4000 1...32767
  7. raw 1...2000 1...32767
  8. long 1...2G 1...32760
  9. long raw 1...2G 1...32760
  10.  
  11. bLOBCLOB,BLOB,NCLOB,BFILE
  12. c) %type,%rowtype
  13.  
  14. 2. PL/sql(块)语法
  15.  
  16. declare
  17. -- 声明部分
  18. begin
  19. -- 可执行部分
  20. exception
  21. -- 异常部分
  22. end;
  23.  
  24.  
  25. declare
  26. name varchar2(20) := '张三';
  27. age number;
  28. begin
  29. name := '&inputname';
  30. age := &inputage;
  31.  
  32. dbms_output.put_line('Hello ' || age || '岁的' || name || '!!!');
  33. end;
  34.  
  35. 3. 给变量赋值
  36. :=
  37.  
  38. select ... into ... from ... where ...
  39. ----------------------------------------------------------------------
  40. declare
  41. name varchar2(20);
  42. job varchar2(20);
  43. begin
  44. select ename,job into name,job from emp where empno = 7788;
  45.  
  46. dbms_output.put_line('name is ' || name || ',job is ' || job);
  47. end;
  48.  
  49. -- 属性类型
  50. %type %rowtype
  51.  
  52. declare
  53. name emp.ename%type; -- emp.ename的类型和长度一致
  54. a_row emp%rowtype;
  55. begin
  56. select ename into name from emp where empno = 7369;
  57. -- rowtype需要查询出*来赋值
  58. select * into a_row from emp where empno = 7788;
  59.  
  60. dbms_output.put_line(name || 'hello world');
  61. dbms_output.put_line('name:'|| a_row.ename || ',job:' || a_row.job || ',sal:' || a_row.sal );
  62. end;
  63.  
  64. 4. 分支
  65. 4.1 if
  66. declare
  67. age number(8);
  68. begin
  69. age := &age;
  70.  
  71. if age < 18 then
  72. dbms_output.put_line('小于18');
  73. elsif age < 30 then
  74. dbms_output.put_line('18到30');
  75. else
  76. dbms_output.put_line('大于30');
  77. end if;
  78. end;
  79.  
  80. 4.2 case
  81. -- 用法一: switch
  82. declare
  83. monthValue number;
  84. begin
  85. monthValue := &mv;
  86. case monthValue
  87. when 1 then
  88. dbms_output.put_line('1月');
  89. when 2 then
  90. dbms_output.put_line('2月');
  91. when 3 then
  92. dbms_output.put_line('3月');
  93. when 4 then
  94. dbms_output.put_line('4月');
  95. when 5 then
  96. dbms_output.put_line('5月');
  97. when 6 then
  98. dbms_output.put_line('6月');
  99. else
  100. dbms_output.put_line('其他月份');
  101. end case;
  102. end;
  103.  
  104. -- 用法二: if else
  105. declare
  106. age number(8);
  107. begin
  108. age := &age;
  109.  
  110. case
  111. when age < 18 then
  112. dbms_output.put_line('小于18');
  113. when age < 30 then
  114. dbms_output.put_line('18到30');
  115. else
  116. dbms_output.put_line('大于30');
  117. end case;
  118. end;
  119.  
  120. 5. 循环
  121. loop循环
  122. declare
  123. x number := 0;
  124. begin
  125. loop exit when x >= 100;
  126. x := x + 1;
  127. dbms_output.put_line('x=' || x);
  128. /*
  129. if x >= 100 then
  130. exit;
  131. end if;
  132. */
  133. end loop;
  134. end;
  135.  
  136. while循环
  137. declare
  138. x number := 0;
  139. begin
  140. while x < 100 loop
  141. x := x + 1;
  142. dbms_output.put_line('x=' || x);
  143. end loop;
  144. end;
  145.  
  146.  
  147. for循环
  148. begin
  149. for i in 10..20 loop -- for的临时变量值可以不用在声明块中定义
  150. dbms_output.put_line('i=' || i);
  151. end loop;
  152. end;
  153.  
  154. -- 九九乘法表
  155. begin
  156. for i in 1..9 loop
  157. for j in 1..i loop
  158. dbms_output.put(' ' || j || '*' || i || '=' || (i*j));
  159. end loop;
  160. dbms_output.put_line('');
  161. end loop;
  162. end;
  163.  
  164. 6. 顺序控制
  165. goto 无条件跳转
  166. null 空语句
  167.  
  168. 7. 动态sql
  169. declare
  170. table_name varchar2(20);
  171. tn_ddl varchar2(200);
  172. begin
  173. table_name := '&tn';
  174. tn_ddl := 'create table ' || table_name || ' ( id varchar2(32) primary key,name varchar2(20) )';
  175. execute immediate tn_ddl;
  176. end;
  177.  
  178. declare
  179. tn varchar2(20); -- 查询的目标表
  180. cl1 varchar2(20); -- 查询的目标列
  181. cl2 varchar2(20); -- 查询的目标列
  182. wcl varchar2(20); -- 条件列
  183. wva varchar2(20); -- 条件值
  184.  
  185. rv1 varchar2(20); -- 查询结果
  186. rv2 varchar2(20); -- 查询结果
  187.  
  188. query_sql varchar2(200);
  189. begin
  190. tn := '&表名';
  191. cl1 := '&列名1';
  192. cl2 := '&列名2';
  193. wcl := '&条件列';
  194. wva := '&条件值';
  195.  
  196. -- select ename,job from emp where empno = :wva
  197. query_sql := 'select ' || cl1 || ',' || cl2 || ' from ' || tn || ' where ' || wcl || ' = :wva';
  198. dbms_output.put_line(query_sql);
  199. execute immediate query_sql into rv1,rv2 using wva;
  200.  
  201. dbms_output.put_line('ename: ' || rv1 || ',job:' || rv2);
  202. end;
  203.  
  204. 8. 异常处理
  205. 抛出异常
  206. declare
  207. -- 自定义异常一定要在declare块中先声明
  208. my_exception exception;
  209. day_flag varchar2(10);
  210. i number;
  211. begin
  212. select to_char(sysdate,'dd') into day_flag from dual;
  213.  
  214. -- 触发预定义异常
  215. i := 10/0;
  216.  
  217. if day_flag < 15 then
  218. -- 抛出自定义异常
  219. raise my_exception;
  220. end if;
  221.  
  222. -- 所有在程序中可能会发生的异常都可以在exception块中进行处理
  223. exception
  224. when my_exception then
  225. dbms_output.put_line('哈哈,抓住你了...');
  226. when zero_divide then
  227. dbms_output.put_line('哈哈,又抓住你了...');
  228. end;
  229.  
  230.  
  231. select * from user_tables;
  232. select * from user_indexes;
  233. select * from user_views;
  234. select * from user_sequences;
  235. select * from user_synonyms;
  236.  
  237.  
  238. --游标eg
  239.  
  240. declare
  241. cursor c_emp is select ename,sal from emp;
  242. v_ename emp.ename%type;
  243. v_sal emp.sal%type;
  244. begin
  245. open c_emp;
  246. loop
  247. fetch c_emp into v_ename,v_sal;
  248. exit when c_emp%notfound;
  249. dbms_output.put_line(v_ename||' : '||v_sal);
  250. end loop;
  251. close c_emp;
  252. end;
  253.  
  254.  
  255. declare
  256. cursor c_emp(dno number) is select ename,sal from emp where deptno=dno;
  257. v_ename emp.ename%type;
  258. v_sal emp.sal%type;
  259. v_count number;
  260. v_dno number;
  261. begin
  262. v_dno:=&v_dno;
  263. select count(*) into v_count from emp where deptno=v_dno;
  264. dbms_output.put_line('count:'||v_count);
  265. open c_emp(v_dno);
  266. loop
  267. fetch c_emp into v_ename,v_sal;
  268. exit when c_emp%notfound;
  269. dbms_output.put_line(v_ename||' : '||v_sal);
  270. end loop;
  271. close c_emp;
  272. end;

猜你在找的Oracle相关文章