精华内容
下载资源
问答
  • oracle 动态游标
    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动态游标示例,通过准备语句、视图和静态游标实现,大家参考使用吧
  • Oracle动态游标

    2021-05-01 10:44:40
    Oracle动态游标(一)强类型动态游标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 管道函数 动态游标,自定义类型,转table
  • 以上第二个游标属于模拟动态, 第二种方式: MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。 参考: 说明: 游标循环 查询和更新是很慢的一件事情 第一层层循环200 第二层...

    表结构:

    5042c99b4f2298e212919c9dc1f82a89.png

    表数据:

    6893d3fdc3809f3d568bf85b483d4e50.png

    期望结果:

    d80fd626b63f7215fccd0e2dbb4a46b3.png

    虽然这种结果可以通过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 ...
  • --打开动态游标,再往下就都一样了 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下的动态游标实现(总结)作者:网络 来源:佚名 更新时间:2008-05-08 10:39:26点击:0不少朋友在开发过程中,要使用到游标进行统计(不用临时表)并返回统计结果,但游标后面的sql却是动态的,如select * from ...
  • 文章目录游标静态游标和动态游标静态游标demo动态游标demo总结 游标 简述:存储过程代码中从表中检索出结果集进行操作交互。 静态游标和动态游标 静态游标:程序执行的时候不需要再去解析sql语言,对于sql语句的解析...
  • MySQL动态游标

    2021-02-03 13:03:20
    MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。一个简单示例:-- 建立测试表和数据create table webuser (username varchar(10));insert into webuser values ('a1'),('a2'),...
  • 动态游标由于含有参数,对于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; --定义一个动态游标 游标名 游标类型; 如果查询的表的数据不同的,动态变化的,这时候可以用动态游标。 需要注意的是,动态游标的定义, ...
  • CREATE or REPLACE FUNCTION insert_p_date() RETURNS text as ``` $$ DECLARE sql_string text; sdate timestamp without ... --关闭游标1 close cur1; --返回结果 RETURN '导入成功!'; END; $$ LANGUAGE plpgsql;
  • 静态游标和动态游标 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存储过程游标(示例)》要点:本文介绍了Mysql必读mysql动态游标与mysql存储过程游标(示例),希望对您有用。如果有疑问,可以联系我们。-- 树立测试表和数据create table webuser ...
  • PLSQL动态游标实例

    千次阅读 2019-05-14 20:05:28
    最近在学习pl/sql语句块编程,学到了游标部分,发现一个神奇的动态游标。具体题目如下:打印出所有emp开头的表的ename列数据(每个emp%表均有ename这一列) 总表结构部分如下: select table_name, column_name ...
  • --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。 dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中。 dbms_sql.column_value(v_cursor, 2, v_no); dbms_sql.column_...
  • 动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。从这个角度来说,静态游标的效率也比动态游标更高一些。 静态游标又分为显式游标和隐式游标:简单来说静态游标,在程序执行的时候,就已经...
  • ORACLE显式游标和动态游标的使用.pdf
  • create 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 动态游标使用使用场景详细步骤A.创建一张测试表B.插入数据C.创建游标 使用场景 当要动态拿表里面配置字段动态去生成一张表、SQL,就可以简单使用一下动态游标 详细步骤 A.创建一张测试表 CREATE TABLE ...
  • 1、简单的来说:强类型的动态游标是指带有return返回语句的,而弱类型的动态游标是指不带return语句的(也即,弱类型的动态游标可以与任何查询语句匹配,但是强类型的动态游标只能与特定的查询语句匹配。) 2、个人...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,822
精华内容 19,928
关键字:

动态游标

友情链接: weatherdemo.rar