当前位置: 首页 > 编程笔记 >

Oracle带输入输出参数存储过程(包括sql分页功能)

万俟浩
2023-03-14
本文向大家介绍Oracle带输入输出参数存储过程(包括sql分页功能),包括了Oracle带输入输出参数存储过程(包括sql分页功能)的使用技巧和注意事项,需要的朋友参考一下

记录一下,免得以后忘记了又要到处去找。

begin /*这里不能直接执行select语句但可以直接执行update、delete、insert语句*/ end里面不能接执行select语句,声明会话级临时表必须有“execute immediate 'TRUNCATE TABLE 表名';”这一句不然其他的session无法drop(TRUNCATE TABLE 表名 必须在 ‘drop table 表名' 这一句前执行)

create or replace procedure p_DevData(p_id IN varchar2(150),pageIndex in NUMBER,pageCount in NUMBER,totalCount in NUMBER,p_cur out sys_refcursor) 
AUTHID CURRENT_USER
as
begin
 declare
 Num_Id number;
 toCount NUMBER;
 strSql varchar2(1000);
 begin
 strSql:='insert into TEMP_ROBOT_Id select id,robot_typeid from ROBOT where ID=:p_id and IS_DEL=0 and STATUS=1';
 execute immediate 'TRUNCATE TABLE TEMP_ROBOT_Id';
 execute immediate 'drop table TEMP_ROBOT_Id';
 execute immediate 'Create Global Temporary Table TEMP_ROBOT_Id(ro_id varchar2(150),robot_typeid number)On Commit Preserve Rows';--创建会话级临时表
execute immediate strSql using p_id;
 execute immediate 'Commit';
 execute immediate 'TRUNCATE TABLE TEMP_Dev_Table';
 execute immediate 'drop table TEMP_Dev_Table ';
 execute immediate 'Create Global Temporary Table TEMP_Dev_Table (id varchar2(150),DEVICE_CODE varchar2(150),NAME varchar2(150))On Commit Preserve Rows';--创建会话级临时表
execute immediate 'insert into TEMP_Dev_Table select distinct bai.ID,bai.DEVICE_CODE,bai.NAME from DEVICE_BASE_INFO bai WHERE bai.ROBOT_ID =(select ro_id from TEMP_ROBOT_Id) and IS_DEL=0 and STATUS=1';
 execute immediate 'Commit';
 execute immediate 'TRUNCATE TABLE TEMP_Dev_data_Table';
 execute immediate 'drop table TEMP_Dev_data_Table ';
 execute immediate ' Create Global Temporary Table TEMP_Dev_data_Table (id varchar2(150),DEVICE_CODE varchar2(150),
 NAME varchar2(150),type_name varchar2(100),YY_NUM varchar2(10),MM_NUM varchar2(10),Day_NUM varchar2(10),
 HH_NUM varchar2(10) )On Commit Preserve Rows';--创建会话级临时表
select Count(1) Into toCount from TEMP_ROBOT_Id;
 if toCount>0 then
 select robot_typeid Into Num_Id from TEMP_ROBOT_Id;
 if Num_Id=1 then
 dbms_output.put_line('视频没有数据');
elsif Num_Id=2 then
 dbms_output.put_line('井盖数据不通');
elsif Num_Id=3 then
 execute immediate 'TRUNCATE TABLE TEMP_SMOKE_ALARM_INFO';
 execute immediate 'drop table TEMP_SMOKE_ALARM_INFO ';
 execute immediate 'CREATE GLOBAL TEMPORARY table TEMP_SMOKE_ALARM_INFO ON COMMIT Preserve ROWS as select * from SMOKE_ALARM_INFO';--创建会话级临时表
execute immediate 'Commit';
 insert into TEMP_Dev_data_Table select t.ID,t.DEVICE_CODE,t.NAME,t.type_name,t.YY_NUM,t.MM_NUM,t.Day_NUM,t.HH_NUM from (
 select tab.ID,tab.NAME,tab.DEVICE_CODE,'烟感报警'as type_name,
 (select count(s.DEVICE_BASE_INFOID) HH_NUM from TEMP_SMOKE_ALARM_INFO s where s.DEVICE_BASE_INFOID=tab.ID
 group by to_char(s.CREATE_DATE,'YYYY'),s.DEVICE_BASE_INFOID) as YY_NUM
 from TEMP_Dev_Table tab)t where t.yy_num is not null;
 Commit;
 elsif Num_Id=4 then
 dbms_output.put_line('未知类型');
elsif Num_Id=5 then
 dbms_output.put_line('未知类型');
else
 dbms_output.put_line('未知类型');
end if;
 end if; 
 end;
 if totalCount<=0 then 
 open p_cur for select * from (
 select row_.*, rownum rownum_
 from (
 select t.* from TEMP_Dev_data_Table t
 order by t.id desc
 ) row_
 where rownum <=case when pageCount <> 0 then pageCount*1 else rownum end /*每页显示多少条*页数*/
 )
where rownum_>=case 
 when pageCount <> 0 
 then 
 /*(页数-1)=0 说明为第一页则(页数-1)*每页显示多少条否则(页数-1)*每页显示多少条+1*/
 case when (pageIndex-1)=0 then ((pageIndex-1)*1) else (((pageIndex-1)*pageCount)+1) end
 else rownum_ end; /*(页数-1)*每页显示多少条+1*/
 else
 open p_cur for select Count(1) as totalCount from TEMP_Dev_data_Table;
 end if;
end p_DevData;

总结

以上所述是小编给大家介绍的Oracle带输入输出参数存储过程(包括sql分页功能),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 问题内容: 我在SQL Server 2008 R2中有一个Oracle链接服务器。我需要执行Oracle存储过程(在第一个过程中使用输出参数,在第二个过程中使用输入参数): 我没有找到有关此问题的完整文档,只有带有无参数选择/非选择过程的简单示例,并且想知道如何调用这些过程,具有内部select的过程以及具有基本参数类型的多参数过程。 问题答案: 它应该像这样工作: 如果您有几个参数,则可能如下

  • 如何使用表(X)作为输入参数编写Oracle存储过程,并且在过程中使用表X与另一个表Y联接? 表X将有数千条记录。 不希望将表名传递为varchar,然后使用动态SQL(因此,此选项不在画面中)

  • 输入/输出示例: infoData序列化输入:总长度5191 当,NVARCHAR(1000),infoData值:总长度-1003 帮助我获得完整的info_Data原样,没有任何丢失或截断。 提前道谢。

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。

  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 我试图效仿http://dba-oracle.com/t_pl_sql_plsql_select_into_clause.htm 但是当我这样做的时候 / 它给出了几个错误: 错误(4,1): PLS-00103:在期望以下情况之一时遇到符号“DECLARE”:开始函数杂注过程子类型当前游标删除存在先前的外部语言符号“begin”被替换为“DECLARE”以继续。 和 错误(14,8):PLS-0