azj1001
补习老师
2011-01-03 23:22
浏览 835
已采纳

oracle的存储过程中可以用with查询吗?比如用with 查询一个结果放到一个游标内怎么做

PROCEDURE COLLECT_RESULT(OUT_RESULT OUT RETURN_CURSOR)
IS
BEGIN
WITH Q1 AS (SELECT 3 + 5 S FROM DUAL),

Q2 AS (SELECT 3 * 5 M FROM DUAL),

Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)

OPEN OUT_RESULT FOR SELECT * FROM Q3;
END COLLECT_RESULT;

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • william_ai
    william_ai 2011-01-04 10:10
    已采纳

    这么玩。
    [code="sql"]
    procedure COLLECT_RESULT(OUT_RESULT out MYTYPE) is
    begin
    open OUT_RESULT for with Q1 as(
    select 3 + 5 as S
    from DUAL), Q2 as (select 3 * 5 as M from DUAL), Q3 as (select S,
    M,
    S + M,
    S * M
    from Q1,
    Q2)
    select * from Q3;
    end COLLECT_RESULT;
    [/code]

    点赞 评论
  • iteye_7064
    iteye_7064 2011-01-04 10:07

    在你的select语句里面使用into
    SELECT 3 + 5 S INTO ttt FROM DUAL
    ttt是个游标,然后操作游标。

    点赞 评论
  • william_ai
    william_ai 2011-01-04 10:10

    [code="java"]
    procedure COLLECT_RESULT(OUT_RESULT out MYTYPE) is
    begin
    open OUT_RESULT for with Q1 as(
    select 3 + 5 as S
    from DUAL), Q2 as (select 3 * 5 as M from DUAL), Q3 as (select S,
    M,
    S + M,
    S * M
    from Q1,
    Q2)
    select * from Q3;
    end COLLECT_RESULT;
    [/code]

    点赞 评论
  • zhanjia
    二进制之路 2011-01-04 16:38

    1、oracle 存储过程的基本语法 及注意事项
    http://www.cnblogs.com/happyday56/archive/2007/07/05/806830.html

    2、ORACLE中带参数、REF游标及动态SQL实例
    --===============带参数的游标==================--
    DECLARE
    dept_code emp.deptno%TYPE; --声明列类型变量三个
    emp_code emp.empno%TYPE;
    emp_name emp.ename%TYPE;
    CURSOR emp_cur(deptparam NUMBER) IS
    SELECT empno, ename FROM EMP WHERE deptno = deptparam; --声明显示游标
    BEGIN
    dept_code := &部门编号; --请用户输入想查看的部门编号
    OPEN emp_cur(dept_code); --打开游标
    LOOP
    --死循环
    FETCH emp_cur
    INTO emp_code, emp_name; --提取游标值赋给上面声明的变量
    EXIT WHEN emp_cur%NOTFOUND; --如果游标里没有数据则退出循环
    DBMS_OUTPUT.PUT_LINE(emp_code || '' || emp_name); --输出查询
    END LOOP;
    CLOSE emp_cur; --关闭游标
    END;

    --=================REF游标==================--

    ACCEPT tab FROMPT '你想查看什么信息?员工(E)或部门信息(D):'; --使用ACCEPT命令弹出对话框让用户输入数据
    DECLARE
    TYPE refcur_t IS REF CURSOR; --声明REF游标类型
    refcur refcur_t; --声明REF游标类型的变量
    pid NUMBER;
    p_name VARCHAR2(100);
    selection VARCHAR2(1) := UPPER(SUBSTR('&tab', 1, 1)); --截取用户输入的字符串并转换为大写
    BEGIN
    IF selection = 'E' THEN
    --如果输入的是'E',则打开refcurr游标,并将员工表查询出来赋值给此游标
    OPEN refcur FOR
    SELECT EMPNO ID, ENAME NAME FROM EMP;
    DBMS_OUTPUT.PUT_LINE('=====员工信息=====');
    ELSIF selection = 'D' THEN
    --如果输入是'D',则打开部门表
    OPEN refcur FOR
    SELECT deptno id, dname name FROM DEPT;
    DBMS_OUTPUT.PUT_LINE('=====部门信息======');
    ELSE
    --否则返回结束
    DBMS_OUTPUT.PUT_LINE('请输入员工信息(E)或部门信息(D)');
    RETURN;
    END IF;
    FETCH refcur
    INTO pid, p_name; --提取行
    WHILE refcur%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE('#' || pid || ':' || p_name);
    FETCH refcur
    INTO pid, p_name;
    END LOOP;
    CLOSE refcur; --关闭游标
    END;

    --===================动态SQL=================--
    VARIABLE maxsal NUMBER; --声明变量
    EXECUTE :maxsal := 2500; --执行引用并给变量赋值
    DECLARE
    r_emp EMP%ROWTYPE; --声明一个行类型变量
    TYPE c_type IS REF CURSOR; --声明REF游标类型
    cur c_type; --声明REF游标类型的变量
    p_salary NUMBER; --声明一个标量变量
    BEGIN
    p_salary := :maxsal; --引用变量
    --使用USING语句将引用到的值传给动态SQL语句'SAL >: 1'中的'1'
    OPEN cur FOR 'SELECT * FROM EMP WHERE SAL >: 1 ORDER BY SAL DESC'
    USING p_salary;
    DBMS_OUTPUT.PUT_LINE('薪水大于' || p_salary || '的员工有:');
    LOOP
    FETCH cur
    INTO r_emp;
    EXIT WHEN cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('编号:' || r_emp.empno || '姓名:' || r_emp.ename ||
    '薪水:' || r_emp.sal);
    END LOOP;
    CLOSE cur; --关闭游标
    END;

    点赞 评论

相关推荐