pl/sql基础语法操作

oracle pl/sql语言(procedural language/sql)是结合了结构化查询与oracle自身过程控制为一体的强大语言。

语法执行块

语法结构:

[ declare 可选 声明变量部分--declaration statements (1);]begin --执行部分--executable statements (2);
[ exception --可选 异常处理--exception statements (3);]end;

语法解析:

  • 声明部分:包含变量和常量的定义,这部分有关键字declare开始,如果不声明变量和产量可以省略这部分。
  • 执行部分:执行部分是pl/sql块指令部分,由关键字begin开始,关键字end结束。所有可执行pl/sql语句放在这一块,该部分执行命令并操作变量。其他pl/sql块可以作为子块嵌套在该部分。pl/sql块的执行部分是必选的。注意end关键字后面要用分号结尾。
  • 异常处理部分:该部分是可选的,该部分用exception关键字把可执行部分分为两个小部分,之前的程序是正常运行的程序,一旦出现异常就跳转到异常部分执行。

声明与赋值

变量
  pl/sql支持sql中的数据类型,pl/sql中正常支持number,varchar2,date等oracle sql数据类型。声明变量必须指明变量的数据类型,也可以声明变量时对变量初始化,变量声明必须在声明部分。语法格式:变量名 数据类型长度 [:=初始值]declarev_name varchar2(20) := 'FULAOSHI';begindbms_output.put_line(v_name);  --打印输出  fulaoshiv_name := 'HELLO WORLD!';dbms_output.put_line(v_name);  -- hello world!end;声明部分 变量   
1. 变量名 数据类型[长度] [:=初始值]   
2. 常量名 constant 数据类型 :=常量值  
declare 
v1 number(38) :=1;
v2 number :=2;
v3 constant number :=3;
v4 number;
beginv4:=v1+v2;dbms_output.put_line(v4);  ---3  v4:=v1+v3;dbms_output.put_line(v4);    ---4 v4:=v4+v1;dbms_output.put_line(v4);     ---5/* v3:=33;   -- 常量不可以再赋值dbms_output.put_line(v3);*/v4:=33;    dbms_output.put_line(v4);   --33 
end;--用plsql 变量计算 123+456的结果 式子
declare
v1 number:=123;
v2 number:=456;
v3 number;
beginv3:=v1+v2;dbms_output.put_line(v3);dbms_output.put_line(v1||'+'||v2||'='||v3);
end;
引用型变量
%type    引用表中字段数据类型赋给变量数据类型
%rowtype 引用数据库表中的一行(所有字段)作为数据类型declare
vename emp.ename%type := 'SMITH';
vsal   emp.sal%type:=800;
begindbms_output.put_line(vename);dbms_output.put_line(vsal);
end;declare
v emp%rowtype;  --- 变量名.字段名
beginv.ename:='SMITH';v.sal:=800;dbms_output.put_line(v.ename);dbms_output.put_line(v.sal);
end;
赋值
注意:
select  into  赋值 是把查询结果赋给变量 只能是单行结果集   可以是多列--打印dept表10部门的部门名称和部门所在地
select  dname,loc
from dept
where deptno=10;declare
v dept%rowtype;
beginselect  dname,loc into v.dname,v.locfrom deptwhere deptno=10;dbms_output.put_line(v.dname||'   '||v.loc);
end;
--注意:
一个变量 一次只能被赋一个值调用时赋值
declare
v1 number(10) := &v1;
v2 varchar2(20) :=&v2;
v4 varchar2(20) :='&v4';
v3 date := &v3;   ---传值的格式需要特别注意
begindbms_output.put_line(v1);dbms_output.put_line(v2);dbms_output.put_line(v4);dbms_output.put_line(v3);
end;
--传入一个部门编号  打印该部门的部门信息
时间变量赋值
--外部输入赋值变量:declarev_date date;v_date_str varchar2(50);beginv_date := to_date('&INPUT','YYYY-MM-DD'); --执行部分 外部传参v_date_str := to_char(v_date, 'YYYY-MM-DD');dbms_output.put_line(v_date_str);exceptionwhen others thendbms_output.put_line('HAVE ERR');end;
打印输出
dbms_output.put_line 打印输出 并换行
dbms_output.put      打印输出 不换行 会将结果输出到缓存  必须最后搭配一个换行才能显示结果begindbms_output.put('abc');dbms_output.put('ABC');dbms_output.put_line('');dbms_output.put_line('q');
end;
异常处理
too_many_rows   返回多行
no_data_found   没找到数据
zero_divide     试图用0做除数
dup_val_on_index 违反唯一性限制    
others      其他异常  写到最后sqlcode  错误代码
sqlerrm  错误描述--异常处理部分实例:declarev_name number(20) := 100;begindbms_output.put_line(v_name); ---100v_name := 'HELLO WORLD!';dbms_output.put_line(v_name);  --数据类型exceptionwhen others thendbms_output.put_line('HAVE ERR'); end;--传入一个员工编号 打印该员工的 员工姓名以及职位--键盘输入一个员工姓名  打印员工编号,输入一个部门编号 打印员工编号 带上异常处理
declare
vempno number;
beginselect  empno into vempnofrom empwhere ename='&ename';---字符串加'',数值型可以不加dbms_output.put_line(vempno);select empno  into vempnofrom empwhere deptno=&deptno;dbms_output.put_line(vempno);
exception when no_data_found thendbms_output.put_line('&ename'||'该员工不存在'); when too_many_rows thendbms_output.put_line(&deptno||'部门不止一人'); when others then dbms_output.put_line('have error'); 
end;

流程控制

循环
判断

if then elsif then…
 if 条件 then执行逻辑1;end if;(1)if关键字开始,end if关键字结束,注意end if后加分号;(2)条件部分可以不使用括号,但是必须以关键字then来表示条件结束,如果条件成立,则执行then后到end if之间的执行逻辑,如果条件不成立,则不执行条件语句块。(3)条件可以使用关系运算符和逻辑运算符。if then elsifif 条件1 then执行逻辑1;elsif 条件2 then执行逻辑2;...[else]执行逻辑n;end if;如果条件1成立,则执行逻辑1;如果条件1不成立,则判断条件2,此时若条件2成立,则执行逻辑2;若条件1与条件2均不成立,则执行else后面的执行逻辑3declarev_num number;v_no number;beginv_num := 4;v_no := 10;if v_num = 3 and v_no = 10 thendbms_output.put_line('IS GOOD!');elsedbms_output.put_line('IS BAD!');end if;exceptionwhen others thendbms_output.put_line('HAVE ERR');end;--练习      
1、传入一个员工编号
操作emp10表 数据同emp
select * from emp10;
drop table emp10;
create table emp10 as select * from emp;
如果这个员工的岗位是ANALYST或者CLERK或者SALESMAN,就给该员工加500元奖金
如果这个员工的岗位是MANAGER,就给该员工加800块奖金
如果这个员工的岗位是PRESIDENT,不做处理declare
vjob varchar2(20);
beginselect job into vjobfrom  emp10where empno=&empno;
--如果这个员工的岗位是ANALYST或者CLERK或者SALESMAN,就给该员工加500元奖金  if vjob in ('ANALYST','CLERK','SALESMAN') thenupdate emp10 set comm=nvl(comm,0)+500  where empno=&empno;
--如果这个员工的岗位是MANAGER,就给该员工加800块奖金elsif vjob='MANAGER' thenupdate emp10 set comm=nvl(comm,0)+800  where empno=&empno;
--如果这个员工的岗位是PRESIDENT,不做处理elsif vjob='PRESIDENT' thendbms_output.put_line('不处理');end if;
--commit;
exception  when others then dbms_output.put_line('报错');
end;2、输入一个员工编号
如果该员工的职位是 ANALYST ,CLERK  或者SALESMAN 就给他加500奖金 
如果他的工资不足3000 则再给他加500奖金
如果该员工职位是MANAGER  给他加800奖金declare
vjob varchar2(20);
vsal number;
beginselect job,sal into vjob,vsalfrom emp10where empno=&empno;
--如果该员工的职位是 ANALYST ,CLERK  或者SALESMAN 就给他加500奖金 if vjob in ('ANALYST','CLERK','SALESMAN') thenupdate emp10 set comm=nvl(comm,0)+500  where empno=&empno;
--如果他的工资不足3000 则再给他加500奖金  if vsal<3000 then update emp10 set comm=nvl(comm,0)+500  where empno=&empno;end if; 
--如果该员工职位是MANAGER  给他加800奖金 elsif vjob='MANAGER' thenupdate emp10 set comm=nvl(comm,0)+800  where empno=&empno;end if; 
--commit ;
exception when others thendbms_output.put_line('报错'); 
end;select * from emp10;
case when
语法: 
case when 条件1 then 要执行的语句;when  条件2 then 要执行的语句;....
else  要执行的语句;
end case;--用case when 做传入一个员工编号如果这个员工工资小于1000,就给他加300奖金如果这个员工工资10002000,就给他加200奖金如果这个员工工资大于2000,就给他加100奖金输出员工编号,员工名字,员工工资,员工奖金    declare 
vemp emp%rowtype;
beginselect sal,empno,ename,nvl(comm ,0)into vemp.sal,vemp.empno,vemp.ename,vemp.comm from emp where empno=&empno; 
case when   vemp.sal<1000 then vemp.comm:=vemp.comm+300;when  vemp.sal between 1000 and 2000  then vemp.comm:=vemp.comm+200; else  vemp.comm:=vemp.comm+100;
end case;
dbms_output.put_line(vemp.sal||'   '||vemp.empno||'   '||vemp.ename||'   '||vemp.comm);
end;--输入一个字符  如果是大写字母 打印大写字母  
--如果是小写字母 打印小写字母 否则打印我不认识该字符 使用 case when 判断declare
v char(1):='&v';
begincase when regexp_like(v,'[A-Z]') thendbms_output.put_line('大写字母');when regexp_like(v,'[a-z]') thendbms_output.put_line('小写字母');else  dbms_output.put_line('我不认识该字符');end case;   
exception when others thendbms_output.put_line('错了');
end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码&#xff1a;相对以前centos7之类的&#xff0c;9版本的默认的网络是NetworkManager&#xff0c;网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

SSL证书有效期缩短有影响吗?

SSL证书是一种用于加密网络通信的安全协议&#xff0c;它可以确保用户在访问网站时&#xff0c;数据传输过程中不会被第三方恶意窃取或篡改。SSL证书通常都有一个有效期限&#xff0c;该期限可以长达几年。然而&#xff0c;最近一些SSL证书颁发机构开始缩短证书的有效期限&…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较&#xff0c;遇到大的8就换位&#xff0c;8再与后面依次比较&#xff0c;没有能和8换位的数&#xff0c;再从下一位2依次与下面的数比较。 console.log(排列之前&#xff1a;arry); for (…

AWS迁移与传输之SCT

AWS Schema Conversion Tool&#xff08;AWS SCT&#xff09;是一款用于数据库迁移的工具&#xff0c;旨在帮助用户将现有的数据库模式&#xff08;包括表、视图、存储过程等&#xff09;从一个数据库引擎转换到另一个数据库引擎。 AWS提供两种模式转换解决方案&#xff0c;使…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

Web测试面试题(二)

一&#xff1a;简述HTTP协议的状态码包含哪些&#xff1f; 2XX&#xff0c;表示成功 3XX&#xff0c;表示重定向 4XX&#xff0c;表示客户端错误 5XX&#xff0c;表示服务器错误 二&#xff1a;HTTP和HTTPS的区别&#xff1f; 《1》安全性上的区别&#xff1a; HTTPS&#x…

AWS 信息资料

EKS 组件信息&#xff1a;Amazon EKS 附加组件 - Amazon EKS&#xff0c;主要用于程序管理插件。 AWS 区域和可用区信息&#xff1a;全球基础设施区域和可用区 如何解决创建 Amazon S3 桶时出现的错误:如何解决创建 Amazon S3 桶时出现的错误 创建 AWS EC2 实例时 userdata使…

LeetCode题解:9. 回文数,翻转一半数字,JavaScript,详细注释

原题链接 9. 回文数 解题思路 翻转数字 利用循环&#xff0c;每次将x右移一位将移出的数字存储到reversed的个位中每次存储前&#xff0c;需要将reversed左移一位 判断结果 当原x的长度为偶数&#xff0c;翻转后的结果相等当原x的长度为奇数&#xff0c;reversed一定比翻转后…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评&#xff1a; 亚马逊测评&#xff0c;简而言之&#xff0c;是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为&#xff0c;并在完成购买后&#xff0c;对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…

成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!

高度近视是指近视度数在600度及以上的一种屈光不正的状态。 近视的眼睛必定是变形的。在正常情况下&#xff0c;人的眼球类似球体&#xff0c;但随着近视加深&#xff0c;眼轴变长&#xff0c;眼球体积逐渐增大&#xff0c;整个眼球从圆球型向椭圆球形发展&#xff0c;而眼球壁…

Linux:top命令的每一列的具体含义

Linux&#xff1a;top命令的每一列的具体含义 文章目录 Linux&#xff1a;top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具&#xff0c;用于实…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的&#xff0c;因此&#xff0c;需要先将要执行运算的数据转换为二进制&#xff0c;然后才能进行执行运算。…

确保数据可视化的准确性:后校验的重要性和方法

前言 在数据可视化项目中&#xff0c;选择合适的图表类型并确定数据字段是首要步骤&#xff0c;但这些步骤本身并不能保证最终的图表能够有效地传达正确的信息。数据的质量和特性可能会影响图表的解释性和准确性。因此&#xff0c;进行后校验以确保数据的适用性和一致性对于避…

[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解数据结构系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

ai电销机器人智能的原理和优势,如何帮助企业来提高销售效率的?

随着人工智能技术的发展&#xff0c;越来越多的企业开始选择使用ai智能外呼系统替代传统的人工拨打电话模式&#xff01;通过精准语音平台群呼潜在客户群体&#xff0c;精准筛选出意向客户并进行分类&#xff0c;实现无缝对接&#xff0c;节省80%人力成本&#xff0c;电销机器人…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号&#xff0c;再根据节点号读取节点坐标&#xff0c;再将…

为什么别人写的SCI文章,容易接收?有技巧?

这篇文章是写给想发期刊文章的&#xff0c;但是导师没有时间去指导的人看的&#xff0c;无论是SCI还是EI、核心这类的,都适用。 想发文章&#xff0c;首先你得有文章&#xff01;以下从写论文的新手内心历程来解答。 paper怎么来呢&#xff1f;那肯定是找创新点&#xff0c;找…

Vue 父组件向子组件传递数据

1、在子组件中&#xff0c;你需要声明你期望从父组件接收哪些props。这可以通过props选项完成&#xff0c;可以是一个数组或对象形式&#xff1a; export default {props: [message]&#xff0c;props:{message:String }props: {message: String, // 类型检查count: {type: Nu…