oracle 游标操作 怎么判断SQL语句是不是查出数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 游标操作 怎么判断SQL语句是不是查出数据相关的知识,希望对你有一定的参考价值。

如下是部分代码(c为显示的游标,param1为参数):
sql :='select * from table_name where no = :p1';
open c for using param1;
if c%rowcount > 0 then
--处理代码
else
--处理代码
end if;
我在PLSQL里面测试的时候,不管没有有查出数据,永远都是执行else里面的,求解释

判断sql语句是否查出数据不用游标操作,只需要判断运行的sql结果的行数是否为0,如果为0,则无数据,如果非0,则有数据。

示例代码如下:

declare
v_count int;--定义变量
begin
  select count(*) into v_count from test;--取出表中数据导变量
  if v_count=0 --判断有无数据
    then dbms_output.put_line(\'表中无数据\');
    else 
      dbms_output.put_line(\'表中有数据,数据条数为\'||v_count);
  end if;
end;

运行结果:

参考技术A %rowcount
这个是来返回你刚刚的DML语句影响的多少行,select 属于DQL语句
像你这种应该用%found
sql :='select * from table_name where no = :p1';
open c for using param1;
if c%found then
--如果游标的结果集有记录执行
else
--处理代码
end if;
%notfound和%found 是刚刚相反的
参考技术B c%NOTFOUND
这个就是没有数据!~~~

--这是我代码的例子 你可以参照一下
IF SUB0010_CUR11%NOTFOUND THEN
CLOSE SUB0010_CUR11;
GOTO SUB0010_190;
END IF;追问

还是有问题,永远不会执行到if判断里面、按照我自己的理解,这个查询语句 select * from table_name where no = ? 无论怎么执行,都会存在一个结果,就算where条件不成立,也会有一个什么也没查到(无数据)的结果、我觉得用notfound判断好像有问题、

追答

你执行sql的代码贴出来看看呗?

追问

代码在上面 一个存储过程 create之类的就没帖出来

追答

你上面的代码也没有运行sql的地方啊!~~~~~~

参考技术C 可以用SQLSTATE来判断
如果sqlstate = '02000',那就肯定为空
参考技术D sql%notfound

sql语句 判断表是不是存在

用户表在当前数据库的系统表中,可使用以下语句进行查找:
select Name,ID from sysobjects where xtype=\'U\'

若是将xtype=\'U\'换成xtype=\'V\'就可以查出来所有视图
xtype参数大概有以下种类:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
FN = 标量函数
IF = 内嵌表函数
K = PRIMARY KEY 或 UNIQUE 约束
L = 日志
P = 存储过程
R = 规则
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
V = 视图
X = 扩展存储过程
参考技术A

IF EXISTS(SELECT name FROM [sysobjects] WHERE name = '表名')

PRINT '该表存在'

ELSE

PRINT '该表不存在'。

    SQL语言,是结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

    SQL语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言作为数据输入与管理的接口。SQL语言语句可以嵌套,这使他具有极大的灵活性和强大的功能。

参考技术B --判断临时表是否存在 
if exists(select * from tempdb.sysobjects where id=object_id('tempdb..#TEMP_TBL'))
    print '存在'
else
    print 不存在'
--判断数据表是否存在
if object_id(N'tablename',N'U') is not null
    print '存在'
else
    print '不存在

参考技术C IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('table_Name') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE table_Name
参考技术D IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id=OBJECT_ID(N'[dbo].[xxxx]') AND
                    type IN (N'U') )
  --DROP TABLE [dbo].[xxxx];

以上是关于oracle 游标操作 怎么判断SQL语句是不是查出数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle游标sql语句代码块的优化

如何使用Oracle的游标?

Oracle游标

Oracle 游标

oracle if 语句

oracle游标概述