-
2021-05-08 19:54:15
今天写了个动态游标 使用传入参数
关于游标分类以及用法:http://hi.baidu.com/edeed/blog/item/725749540ee73651574e006a.html
思路就是先拼好SQL 然后开动态游标
ORALCE10G也支持正则表达式 呵呵 刚刚好可以实现动态传入参数
procedure TJ_PDA_TESTDATA(v_indicator in varchar) is
type rc is ref cursor;
l_cursor rc;
l_sqlstr varchar(2000);
l_sqlstr_new varchar(2000);
l_raw_use raw_pda_testdata_tj%rowtype;
l_date varchar(20);
begin
select to_char(sysdate, 'YYYY-MM-DD') into l_date FROM DUAL;
l_sqlstr := 'select a.region_id,
sum(count) totle,
''$v_date'' creatdate,
''$v_indicator'' indicator,
sum(case lev when 1 then count else 0 end) lev1,
sum(case lev when 2 then count else 0 end) lev2,
sum(case lev when 3 then count else 0 end) lev3,
sum(case lev when 4 then count else 0 end) lev4,
sum(case lev when 5 then count else 0 end) lev5,
sum(case lev when 6 then count else 0 end) lev6
from (select zhiju_id region_id, $v_indicator lev, count(1) count
from raw_pda_testdata_use t
where creatdate like ''$v_date%''
and zhiju_id != ''-1''
group by zhiju_id, $v_indicator) a
group by region_id';
SELECT REGEXP_REPLACE(l_sqlstr, '\$v_date', l_date) into l_sqlstr FROM dual;
SELECT REGEXP_REPLACE(l_sqlstr, '\$v_indicator', v_indicator) into l_sqlstr_new FROM dual;
open l_cursor for l_sqlstr;
loop
fetch l_cursor
into l_raw_use;
exit when l_cursor%notfound;
begin
insert into raw_pda_testdata_tj
values
(l_raw_use.region_id,
l_raw_use.creatdate,
l_raw_use.indicator,
l_raw_use.totle,
l_raw_use.lev1,
l_raw_use.lev2,
l_raw_use.lev3,
l_raw_use.lev4,
l_raw_use.lev5,
l_raw_use.lev6);
commit;
EXCEPTION
WHEN others THEN
rollback;
end;
end loop;
close l_cursor;
EXCEPTION
WHEN others THEN
null;
END; -- Procedure
更多相关内容 -
mysql动态游标学习(mysql存储过程游标)
2020-09-10 17:10:10mysql动态游标示例,通过准备语句、视图和静态游标实现,大家参考使用吧 -
Oracle动态游标
2021-05-01 10:44:40Oracle动态游标(一)强类型动态游标1 定义强类型动态游标是指,在游标使用之前,虽未指定游标的查询定义,但是游标的类型已经确定。2 语法type 游标类型 is ref cursor return 记录类型3 应用场景、用户想在表dept中...Oracle动态游标
(一)强类型动态游标
1 定义
强类型动态游标是指,在游标使用之前,虽未指定游标的查询定义,但是游标的类型已经确定。
2 语法
type 游标类型 is ref cursor return 记录类型
3 应用场景、
用户想在表dept中查看Beijing这一城市的具体信息。如果表中没有Beijing的记录信息,则用户希望能够查看所有城市的信息。
程序:
begin
declare
type ref_deptrow is ref cursor return dept%rowtype; /*强类型动态游标声明*/
c_count number;
deptrow dept%rowtype;
cur_deptrow ref_deptrow;
begin
select count(*) into c_count from dept where loc = 'Beijing';
if c_count = 0 then
open cur_deptrow for select * from dept;
else
open cur_deptrow for select * from dept where loc = 'Beijing';
end if;
fetch cur_deptrow into deptrow;
while cur_deptrow%found loop
dbms_output.put_line(deptrow.deptno || ':' || deptrow.dname || ':' || deptrow.loc);
fetch cur_deptrow into deptrow;
end loop;
end;
end;
/
运行结果:
10:ACCOUNTING:NEW YORK
20:RESEARCH:DALLAS
30:SALES:CHICAGO
40:OPERATIONS:BOSTON
PL/SQL procedure successfully completed.
(三)弱类型动态游标
1 定义
弱类型动态游标指的是在游标使用之前,游标的类型无法具体确定,要等到程序执行时,才能确定游标的类型。与强类型动态游标相比,弱类型动态游标没有返回类型。
2 语法
type 游标类型 is ref cursor
3 应用场景
用户想要在表emp查询deptno为40的部门信息,若查不到则想在表dept中继续查询。
程序:
begin
declare
type ref_tablerow is ref cursor;
c_count number;
emprow emp%rowtype;
deptrow dept%rowtype;
cur_tablerow ref_tablerow;
begin
select count(*) into c_count from emp where deptno = 40;
if c_count = 0 then
open cur_tablerow for select * from dept where deptno = 40;
fetch cur_tablerow into deptrow;
while cur_tablerow%found loop
dbms_output.put_line(deptrow.deptno || ':' ||
deptrow.dname || ':' ||
deptrow.loc);
fetch cur_tablerow into deptrow;
end loop;
else
open cur_tablerow for select * from emp where deptno = 40;
fetch cur_tablerow into emprow;
while cur_tablerow%found loop
dbms_output.put_line(emprow.deptno || ':' ||
emprow.empno || ':' ||
emprow.ename);
fetch cur_tablerow into deptrow;
end loop;
end if;
end;
end;
/
运行结果:
40:OPERATIONS:BOSTON
PL/SQL procedure successfully completed.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29485627/viewspace-1248672/,如需转载,请注明出处,否则将追究法律责任。
-
Oracle动态游标入门
2021-05-01 10:44:43说明:下面的存储过程在Oracle817下全部通过测试,编译和运行均是正确的一、最简单的一个动态游标:CREATE OR REPLACE PROCEDURE test_curisstrSql1 varchar(1000);TYPE TCUR IS REF CURSOR;CUR TCUR;AC_WHERE ...说明:下面的存储过程在Oracle817下全部通过测试,编译和运行均是正确的
一、最简单的一个动态游标:
CREATE OR REPLACE PROCEDURE test_cur
is
strSql1 varchar(1000);
TYPE TCUR IS REF CURSOR;
CUR TCUR;
AC_WHERE VARCHAR2(100);
AC VARCHAR2(100);
BEGIN
AC_WHERE := '(52228,52230)';
OPEN CUR FOR 'SELECT bill_id FROM bill_main WHERE bill_id IN '|| AC_WHERE;
LOOP
FETCH CUR INTO AC;
EXIT WHEN CUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(AC);
END LOOP;
CLOSE CUR;
end test_cur;
二、动态游标中使用动态的SQL语句并执行:
CREATE OR REPLACE PROCEDURE test_cur
(
p_orgid_wins string
)
is
strSql1 varchar2(1000);
TYPE My_CurType IS REF CURSOR;
CUR_1 My_CurType;--指示CUR_1的类型为My_CurType,而My_CurType是游标类型
AC_WHERE VARCHAR2(100);
AC VARCHAR2(100);
BEGIN
AC_WHERE := '(52228,52230)';
OPEN CUR_1 FOR 'SELECT bill_id FROM bill_main WHERE bill_id IN '|| AC_WHERE;--打开动态游标
LOOP
FETCH CUR_1 INTO AC;
EXIT WHEN CUR_1%NOTFOUND;
strSql1:='delete bill_main where bill_id='||AC;
DBMS_OUTPUT.PUT_LINE(strSql1);
DBMS_OUTPUT.PUT_LINE(AC);
execute immediate strSql1;--执行一个动态的SQL语句
commit;
END LOOP;
CLOSE CUR_1;
end test_cur;
三、动态游标中执行动态DQL语句:
CREATE OR REPLACE PROCEDURE test_cur
(
p_orgid_wins string
)
is
strSql1 varchar2(1000);
strSql2 varchar2(1000);
TYPE My_CurType IS REF CURSOR;
CUR_1 My_CurType;--指示CUR_1的类型为My_CurType,而My_CurType是游标类型
AC_WHERE VARCHAR2(100);
t_to_orgid number;
t_bill_id number;
BEGIN
AC_WHERE := '(98978,98980)';
strSql1:='SELECT bill_id,to_orgid FROM bill_main WHERE bill_id IN '|| AC_WHERE;
DBMS_OUTPUT.PUT_LINE(strSql1);
OPEN CUR_1 FOR strSql1;--打开动态游标
LOOP
FETCH CUR_1 INTO t_bill_id,t_to_orgid;
EXIT WHEN CUR_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('t_to_orgid='||t_to_orgid);
strSql2:='delete bill_main where bill_id='||t_bill_id;
strSql2:=strSql2|| 'and start_no='||'16506';
DBMS_OUTPUT.PUT_LINE(strSql2);
DBMS_OUTPUT.PUT_LINE(t_bill_id);
execute immediate strSql1;--执行一个动态的SQL语句
commit;
END LOOP;
CLOSE CUR_1;
end test_cur;
-
oracle 管道函数+动态游标
2013-12-17 13:36:44oracle 管道函数 动态游标,自定义类型,转table -
MySQL嵌套游标循环、动态游标
2021-01-18 19:50:42以上第二个游标属于模拟动态, 第二种方式: MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。 参考: 说明: 游标循环 查询和更新是很慢的一件事情 第一层层循环200 第二层...表结构:
表数据:
期望结果:
虽然这种结果可以通过MySQL中的GROUP_CONCAT函数实现,但是此函数有字节长度限制
SELECT ROW_ID, CAST(CONCAT('[', GROUP_CONCAT('{\'FIELD_ID\'', ' : ', IF(INSTR(VALUE, '[{') = 0, CONCAT('\'', VALUE, '\''), VALUE), '}'), ']') AS BINARY) FROM T_TASK_DATA GROUP BY ROW_ID
DELIMITER $$
USE `mpp_master_data`$$
DROP PROCEDURE IF EXISTS `SP_QUERY_TASK_DATA`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_QUERY_TASK_DATA`()
BEGIN
DECLARE V_FIG INT DEFAULT 0;
DECLARE V_ROW_ID INT;
DECLARE V_FIELD_ID INT;
DECLARE V_FIELD_VALUE VARCHAR(10240);
DECLARE V_CRS_TASK_DATA CURSOR FOR SELECT DISTINCT ROW_ID AS V_ROW_ID FROM T_TASK_DATA LIMIT 0, 200;
DECLARE V_CRS_FIELD_DATA CURSOR FOR SELECT FIELD_ID AS V_FIELD_ID, VALUE AS V_FIELD_VALUE FROM T_TASK_DATA WHERE ROW_ID=V_ROW_ID ORDER BY FIELD_ID ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET V_FIG = 1;
-- 创建临时表
DROP TABLE IF EXISTS TMP_TASK_ROW_DATA;
CREATE TEMPORARY TABLE TMP_TASK_ROW_DATA(ROW_ID INT(10), VALUE VARCHAR(10240), PRIMARY KEY (`ROW_ID`));
-- 打开第一层游标,进行遍历
OPEN V_CRS_TASK_DATA;
ROW_LOOP: LOOP
FETCH V_CRS_TASK_DATA INTO V_ROW_ID;
IF V_FIG = 1 THEN
LEAVE ROW_LOOP;
END IF;
SET @V_VALUE = '';
-- 打开第二层游标,进程遍历
OPEN V_CRS_FIELD_DATA;
FIELD_LOOP: LOOP
FETCH V_CRS_FIELD_DATA INTO V_FIELD_ID, V_FIELD_VALUE;
IF V_FIG = 1 THEN
LEAVE FIELD_LOOP;
END IF;
SET @V_VALUE = CONCAT(@V_VALUE, CONCAT(',{"FIELD_ID": ', V_FIELD_ID, ', "VALUE": "', IFNULL(V_FIELD_VALUE, '') ,'"}'));
END LOOP FIELD_LOOP;
CLOSE V_CRS_FIELD_DATA;
SET V_FIG = 0;
SET @V_VALUE = SUBSTRING(@V_VALUE, 2);
SET @V_VALUE = REPLACE(@V_VALUE, '"', '#');
SET @V_VALUE = REPLACE(@V_VALUE, '\'', '$');
SET @V_SQL = CONCAT('INSERT INTO TMP_TASK_ROW_DATA(ROW_ID, VALUE) VALUES (', V_ROW_ID, ', \'[', @V_VALUE, ']\');');
-- SELECT V_ROW_ID, @V_VALUE, @V_SQL;
PREPARE MAIN_STMT FROM @V_SQL;
EXECUTE MAIN_STMT;
DEALLOCATE PREPARE MAIN_STMT;
END LOOP ROW_LOOP;
CLOSE V_CRS_TASK_DATA;
SELECT * FROM TMP_TASK_ROW_DATA;
DROP TABLE TMP_TASK_ROW_DATA;
END$$
DELIMITER ;
以上第二个游标属于模拟动态,
第二种方式:
MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。
参考:
说明:
游标循环 查询和更新是很慢的一件事情
第一层层循环200
第二层循环最大15
执行拼接的SQL插入数据到临时表
总共耗时21秒左右,两层循环耗时16秒左右
-
静态游标和动态游标
2019-08-05 23:52:11静态游标 当打开游标时,数据集会被存在 tempDB中。 游标打开后,对源数据表的更改不会显示在游标的结果中。例如 use svc go declare @RMANumber int declare @InUser char(20) declare cur cursor ... -
oracle动态游标的简单实现方法
2021-05-01 02:37:10--打开动态游标,再往下就都一样了 open c1 for sql2; loop fetch c1 into r_c1; exit when c1%notfound; str1:=''; str2:=''; --打开工序表进行处理 open c2(r_c1.pbom_id); loop fetch c2 into r_c2; exit when ... -
Oracle下的动态游标实现(总结)
2021-05-06 05:00:34Oracle下的动态游标实现(总结)作者:网络 来源:佚名 更新时间:2008-05-08 10:39:26点击:0不少朋友在开发过程中,要使用到游标进行统计(不用临时表)并返回统计结果,但游标后面的sql却是动态的,如select * from ... -
Oracle之静态游标与动态游标
2020-08-05 19:35:34文章目录游标静态游标和动态游标静态游标demo动态游标demo总结 游标 简述:存储过程代码中从表中检索出结果集进行操作交互。 静态游标和动态游标 静态游标:程序执行的时候不需要再去解析sql语言,对于sql语句的解析... -
MySQL动态游标
2021-02-03 13:03:20MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。一个简单示例:-- 建立测试表和数据create table webuser (username varchar(10));insert into webuser values ('a1'),('a2'),... -
『ORACLE』 PLSQL动态游标的使用(11g)
2021-05-02 01:33:24动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。从这个角度来说,静态游标的效率也比动态游标更高一些。#游标的相关概念:定义:游标它是一个服务器端的存储区,这个区域提供给用户使用... -
mysql动态游标
2019-01-04 13:49:05一、游标的使用 DROP PROCEDURE IF EXISTS myCURSOR; CREATE PROCEDURE myCURSOR () BEGIN DECLARE user_name VARCHAR(32); /* 声明游标 */ DECLARE my_cursor CURSOR FOR select nickname from users; /* 打开... -
ORACLE 动态游标的使用
2020-06-23 15:15:25动态游标可以遍历动态的表, 格式: TYPE 游标类型 IS REF CURSOR; --定义一个动态游标 游标名 游标类型; 如果查询的表的数据不同的,动态变化的,这时候可以用动态游标。 需要注意的是,动态游标的定义, ... -
postgresql动态游标使用案例
2020-12-22 02:53:24CREATE or REPLACE FUNCTION insert_p_date() RETURNS text as ``` $$ DECLARE sql_string text; sdate timestamp without ... --关闭游标1 close cur1; --返回结果 RETURN '导入成功!'; END; $$ LANGUAGE plpgsql; -
Oracle 动态游标和静态游标区别 (性能 解析效率 打开速度 联接速度)
2018-12-26 10:58:08静态游标和动态游标 2012年01月17日 23:33:42 孔乙已 阅读数:6821 标签: 数据库insertdeletectablenull 更多 个人分类: SQL SERVER 静态游标在打开时会将数据集存储在tempdb中,因此显示的数据与游标... -
sqlserver 动态游标
2018-06-23 16:55:28--创建动态游标set @sql = 'declare rowCursor cursor For select aimg,aname,aprice from ( select *, ROW_NUMBER() over('+ @order +') as rn from (select id,aimg,aname,aprice from F_Anli where '+ @where +')... -
Mysql必读mysql动态游标与mysql存储过程游标(示例)
2021-01-18 17:59:36《Mysql必读mysql动态游标与mysql存储过程游标(示例)》要点:本文介绍了Mysql必读mysql动态游标与mysql存储过程游标(示例),希望对您有用。如果有疑问,可以联系我们。-- 树立测试表和数据create table webuser ... -
PLSQL动态游标实例
2019-05-14 20:05:28最近在学习pl/sql语句块编程,学到了游标部分,发现一个神奇的动态游标。具体题目如下:打印出所有emp开头的表的ename列数据(每个emp%表均有ename这一列) 总表结构部分如下: select table_name, column_name ... -
【讨论】关于动态游标输出问题
2021-05-04 09:17:37--fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。 dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中。 dbms_sql.column_value(v_cursor, 2, v_no); dbms_sql.column_... -
数据库里面的游标,动态游标和静态游标区别
2016-12-08 19:28:18动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。从这个角度来说,静态游标的效率也比动态游标更高一些。 静态游标又分为显式游标和隐式游标:简单来说静态游标,在程序执行的时候,就已经... -
ORACLE显式游标和动态游标的使用.pdf
2021-10-10 06:56:51ORACLE显式游标和动态游标的使用.pdf -
Oracle存储过程记实(动态游标)
2018-12-19 15:11:31create or replace procedure P_TP_SQHDFJ as str_sql varchar2(300); type ref_cursor_type ... --定义一个动态(弱)游标 sqhd_fj_list ref_cursor_type;--定义游标类型 fj sqhd_fj%rowtype;--定义变量类型,s... -
SQL Server动态游标简单使用(随手笔记)
2020-04-16 13:20:50SQL SERVER 动态游标使用使用场景详细步骤A.创建一张测试表B.插入数据C.创建游标 使用场景 当要动态拿表里面配置字段动态去生成一张表、SQL,就可以简单使用一下动态游标 详细步骤 A.创建一张测试表 CREATE TABLE ... -
强类型的动态游标和弱类型的动态游标区别
2018-01-29 22:58:221、简单的来说:强类型的动态游标是指带有return返回语句的,而弱类型的动态游标是指不带return语句的(也即,弱类型的动态游标可以与任何查询语句匹配,但是强类型的动态游标只能与特定的查询语句匹配。) 2、个人...