• Oracle学习 第28天 存储过程输出结果集


    周末闲来练练Oracle的存储过程,还从来没写过,一写立马蒙逼。。。没有对比就没有伤害,SQL Server和SSMS真是方便啊

    一、建立存储过程

    CREATE OR REPLACE PROCEDURE upCustomStat (
        sAction VARCHAR2,
        dNewFromDate DATE,
        dNewToDate DATE,
        dOldFromDate DATE,
        dOldToDate DATE,
        sSQLText VARCHAR2
    ) AS
    sSQL VARCHAR2(4000);
    sIntRegServer VARCHAR2(50);
    sIntRegDBName VARCHAR2(50);
    sIntRegLinkServer VARCHAR2(100);
    p_cur SYS_REFCURSOR;
    CaseID VARCHAR2(50);
    BEGIN
        OPEN p_cur FOR SELECT CASEID FROM Caseproject WHERE ROWNUM < 10;
        LOOP
            FETCH p_cur INTO CaseID;
            EXIT WHEN p_cur%NOTFOUND;
            dbms_output.put_line(CaseID);
        END LOOP;
        CLOSE p_cur;
    END;

    1、END末尾没有分号要报错,又提示的乱七八槽,找了半天才找到

    错误:PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
            ; <an identifier>
              <a double-quoted delimited-identifier> current delete exists
              prior <a single-quoted SQL string>
           符号 ";" 被替换为 "end-of-file" 后继续。
    行:1498

    2、在存储过程里面的语法错误,执行后不会提示,但存储过程是编译不通过的,这样太不方便查原因了

     3、要想实时查看错误的话,要在存储过程上右键->编辑

    4、编辑存储过程有个问题,平时我们都是用.sql文件存起来的,右键编辑调试完成后,还要手动复制到.sql文件中,太不方便。

    直接保存的话是存成.prc文件,用这种存起来倒是也可以,但SQL Server过来习惯了存.sql文件,也比较通用。

    二、调用存储过程

    BEGIN 
        UPCUSTOMSTAT ('按开发项目统计预售情况数据',  TO_DATE('2016-07-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),
            TO_DATE('2016-08-31 23:59:59','YYYY-MM-DD HH24:MI:SS'), NULL, NULL, NULL);
    END;

     1、EXEC 存储过程名不行,看网上说好像要在命令行模式下?

    2、在PL/SQL里的SQL窗口,只能用BEGIN END里直接执行

    3、时间参数,不能直接传字符串,而是要转换。。。SQL Server都能自动识别

    =================================

    以上是使用dbms_output.put_line输出PRINT之类的文本,要输出结果集要用游标

    =================================

    三、输出结果集

    1、存储过程使用游标

    CREATE OR REPLACE PROCEDURE upCustomStat (
        sAction VARCHAR2,
        dNewFromDate DATE,
        dNewToDate DATE,
        dOldFromDate DATE,
        dOldToDate DATE,
        sSQLText VARCHAR2,
        p_cur OUT SYS_REFCURSOR
    ) AS
    sSQL VARCHAR2(4000);
    sIntRegServer VARCHAR2(50);
    sIntRegDBName VARCHAR2(50);
    sIntRegLinkServer VARCHAR2(100);
    BEGIN
        OPEN p_cur FOR SELECT * FROM Caseproject WHERE ROWNUM < 10;
    END upCustomStat;

    2、调用时传入游标

    DECLARE
        p_cur SYS_REFCURSOR;
    BEGIN
        UPCUSTOMSTAT ('按开发项目统计预售情况数据',  TO_DATE('2016-07-01 00:00:00','YYYY-MM-DD HH24:MI:SS'),
            TO_DATE('2016-08-31 23:59:59','YYYY-MM-DD HH24:MI:SS'), NULL, NULL, NULL, p_cur);
    END;

    3、有了游标,按SQL Server惯性思维,一直想把结果集SELECT出来,搜了半天,看来是不行。。。只能手动输出

     

    四、SQL Command

    PL/SQL的Command和SQL Plus的Command还不一样。。。

    SQL> var rset refcursor; 
    SQL> exec getEmpByDept(10,:rset); 
    SQL> print rset;

    参照网上的这一段,在PL/SQL的命令行,会报【 REFCURSOR not supported】这个错,不识别,要SQL Plus才可以

    使用SQL Plus后,确实能够根据游标把结果集查询出来

    五、定义游标

    1、使用【sys_refcursor】,即和上面用法一样,这个最方便

    2、使用包来定义【ref cursor】,要多定义一个包头,再在包体中定义存储过程

    StackOverFlow上有高手论述过,sys_refcursor其实就是事先定义好的ref cursor,专门为了方便的(少定义一个包头),可以放心使用

  • 相关阅读:
    求取32位无符号整数中最低位位值为1的位置 && 求取32位无符号整数中最高位位值为1的位置
    交换寄存器中的相应字段
    NDK与JNI
    plt_0
    32位无符号整数平方根
    提取 主 设备号
    爱江山更爱美人
    mysql oracle sqlserver 数据库分页
    详解JDBC驱动的四种类型
    oracle sqlplus 中的清屏命令
  • 原文地址:https://www.cnblogs.com/liuyouying/p/7185757.html
Copyright © 2020-2023  润新知