Oracle(存储过程,触发器等中) if语句中不能有子查询的原因和解决方案
来源:互联网 发布:linux write 编辑:程序博客网 时间:2024/06/06 03:56
如果我们输入并运行以下代码:
begin if 'U001' in (select userId from userInfo) then dbms_output.put_line('用户编号重复'); end if;end;
会得到以下的错误信息:
可以知道,PL/SQL中,if语句是不能有子查询的,PL/SQL的语法有限制。IF 后面只能是逻辑表达式
实际应用中
如创建以下存储过程
create or replace procedure proc_user_reg(Param_userId varchar2,Param_realName varchar2,Param_password varchar2)isbegin if Param_userId in (select userId from userInfo) then dbms_output.put_line('用户编号重复'); else insert into userInfo values(Param_userId,Param_realName,Param_password,default); end if;end;在调用此存储过程中也会出现上面的问题
解决方法:
定义一个变量,通过count(*)来统计原表中重复数据的个数。相当于用另一种方法实现了IN语句的判断
--变量的定义声明在is或as后
create or replace procedure proc_user_reg(Param_userId varchar2,Param_realName varchar2,Param_password varchar2)is countResult number;begin select count(*) into countResult from userInfo where userId=Param_userId; if countResult=0 then insert into userInfo values(Param_userId,Param_realName,Param_password,default); else dbms_output.put_line('用户编号重复'); end if;end;
- Oracle(存储过程,触发器等中) if语句中不能有子查询的原因和解决方案
- Oracle中查询有哪些存储过程的sql语句
- mysql中触发器和存储过程的if-else中的子句不能为空
- 如何在oracle存储过程中使用 create,drop 等不能"回滚" 的语句
- sql触发器和存储过程,索引,事务,游标,视图以及子查询等不同的参数、前后触等
- Oracle 中重新编译无效的存储过程, 或函数、触发器等对象
- Oracle中重新编译无效的存储过程, 或函数、触发器等对象
- Oracle 中重新编译无效的存储过程, 或函数、触发器等对象
- 在Oracle数据库中查询所有触发器、存储过程、视图、表的两种方法
- 在Oracle数据库中查询所有触发器、存储过程、视图、表的两种方法
- 存储过程中,if语句使用
- Oracle中函数、存储过程、触发器
- 存储过程中,goto语句和if else语句注意,标签的位置问题导致条件语句失效
- 在子查询语句(或视图等)中,不能使用Order by语句,除非使用TOP 或 FOR XML
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle查看表、存储过程、触发器、函数等对象定义语句的方法
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- IIS安全加固策略-应对攻击入侵策略
- linux ---- 进程 --- 2
- java类转换为xml
- LJMM平台( Linux +Jexus+MySQL+mono) 上使用MySQL的简单总结
- Leetcode 分开链表
- Oracle(存储过程,触发器等中) if语句中不能有子查询的原因和解决方案
- 黑马程序员——集合框架
- pthread 多线程编程_mutex 和 cond_t
- linux ---- 进程 --- 3
- Oracle 几个简单的数字函数
- Java RSA加密
- linux ---- shell ---- 1
- 认识单片机-单片机最小系统
- C++源文件的后缀名问题