查看: 6054|回复: 8

[PL/SQL] 【大话IT】怎么用存储过程返回一行记录(变量)

[复制链接]
求职 : 数据分析/ETL
论坛徽章:
10
鲜花蛋
日期:2014-08-09 15:15:33目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02秀才
日期:2017-04-05 13:22:592015年新春福章
日期:2015-03-06 11:59:47暖羊羊
日期:2015-03-04 14:54:57itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12目光如炬
日期:2018-07-01 22:00:00
发表于 2015-3-6 21:48 | 显示全部楼层 |阅读模式
CREATE OR REPLACE TYPE emp_test AS OBJECT
(
    empno    NUMBER(4),
    ename    VARCHAR2(10),
    job      VARCHAR2(9),
    mgr      NUMBER(4),
    hiredate DATE,
    sal      NUMBER(7, 2),
    comm     NUMBER(7, 2),
    deptno   NUMBER(2)
)

CREATE OR REPLACE TYPE emp_tab IS TABLE OF emp_test;

CREATE OR REPLACE PROCEDURE stelf_test_p(pi_empno IN NUMBER, po_emp_tab OUT emp_test) IS
BEGIN

    SELECT emp_test(empno, ename, job, mgr, hiredate, sal, comm, deptno) BULK COLLECT
        INTO po_emp_tab
        FROM (SELECT * FROM emp WHERE empno = pi_empno);

END;

还有其它的办法可以返回记录类型的变量吗?正常情况下都只有一行记录,我测试的代码可以通过。
在系统上换成另外的结构体,在 select  bulk collect into 的时候报结构体内的参数(标识符)无效!!

后续还要把返回的结果(变量)通过webservice传到另一个数据库,来更新该库的表。
有什么好的办法去实现吗?更新的时候不能用dblink

求职 : 数据分析/ETL
论坛徽章:
10
鲜花蛋
日期:2014-08-09 15:15:33目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02秀才
日期:2017-04-05 13:22:592015年新春福章
日期:2015-03-06 11:59:47暖羊羊
日期:2015-03-04 14:54:57itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12目光如炬
日期:2018-07-01 22:00:00
 楼主| 发表于 2015-3-6 23:01 | 显示全部楼层
DECLARE
        TYPE emp_record_type IS RECORD(
                empno    NUMBER(4),
                ename    VARCHAR2(10),
                job      VARCHAR2(9),
                mgr      NUMBER(4),
                hiredate DATE,
                sal      NUMBER(7, 2),
                comm     NUMBER(7, 2),
                deptno   NUMBER(2));

        TYPE emp_record_tab IS TABLE OF emp_record_type;

        emp_test_tab emp_record_tab;

        v_ename emp.ename%TYPE;

BEGIN
        SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno BULK COLLECT INTO emp_test_tab FROM emp;
        WHERE emp.empno = 7369;

        FOR i IN 1 .. emp_test_tab.count LOOP
                dbms_output.put_line(emp_test_tab(i).ename);
        END LOOP;
END;

使用道具 举报

回复
论坛徽章:
533
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2015-3-7 00:27 | 显示全部楼层
这个是什么意思:“在系统上换成另外的结构体,在 select  bulk collect into 的时候报结构体内的参数(标识符)无效!!”
给出报错的代码,以及错误信息。

除了用这种嵌套表数组,你也可以用记录型的数组,先声明一个包,然后在包头定义记录类型以及数组类型。

使用道具 举报

回复
求职 : 数据分析/ETL
论坛徽章:
10
鲜花蛋
日期:2014-08-09 15:15:33目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02秀才
日期:2017-04-05 13:22:592015年新春福章
日期:2015-03-06 11:59:47暖羊羊
日期:2015-03-04 14:54:57itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12目光如炬
日期:2018-07-01 22:00:00
 楼主| 发表于 2015-3-7 11:04 来自手机 | 显示全部楼层
newkid 发表于 2015-3-7 00:27:06
这个是什么意思:“在系统上换成另外的结构体,在 select  bulk collect into 的时候报结构体内的参数(标识符)无效!!”
给出报错的代码,以及错误信息。

除了用这种嵌套表

找到原因了,在后面的select  from里面给了空值!!

使用道具 举报

回复
求职 : 数据分析/ETL
论坛徽章:
10
鲜花蛋
日期:2014-08-09 15:15:33目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02秀才
日期:2017-04-05 13:22:592015年新春福章
日期:2015-03-06 11:59:47暖羊羊
日期:2015-03-04 14:54:57itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12目光如炬
日期:2018-07-01 22:00:00
 楼主| 发表于 2015-3-7 11:04 来自手机 | 显示全部楼层
tanghaixuan 发表于 2015-3-7 02:40:45
前排围观。。。。。。。

灰常感谢!!

使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31优秀写手
日期:2014-02-21 06:00:13马上有车
日期:2014-10-09 10:14:53技术图书徽章
日期:2017-07-12 17:18:46妮可·罗宾
日期:2017-08-10 12:13:56
发表于 2015-3-8 09:49 | 显示全部楼层
公司用的是record

使用道具 举报

回复
认证徽章
论坛徽章:
5
2014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:112015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31秀才
日期:2016-03-24 09:10:24
发表于 2015-3-12 01:17 | 显示全部楼层
使用参考游标更好一些

使用道具 举报

回复
求职 : 数据分析/ETL
论坛徽章:
10
鲜花蛋
日期:2014-08-09 15:15:33目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02秀才
日期:2017-04-05 13:22:592015年新春福章
日期:2015-03-06 11:59:47暖羊羊
日期:2015-03-04 14:54:57itpub13周年纪念徽章
日期:2014-10-05 10:01:16优秀写手
日期:2014-03-12 06:00:12目光如炬
日期:2018-07-01 22:00:00
 楼主| 发表于 2015-3-14 23:35 | 显示全部楼层
alfah 发表于 2015-3-12 01:17
使用参考游标更好一些

也可以用游标,在前台接收以后组装再发送。这边是领导定的方案,我们就只能执行了

使用道具 举报

回复
论坛徽章:
3
美羊羊
日期:2015-03-04 14:52:282015年新春福章
日期:2015-03-06 11:58:18秀才
日期:2015-09-14 10:08:30
发表于 2015-3-16 10:10 | 显示全部楼层
CREATE OR REPLACE PROCEDURE stelf_test_p(pi_empno IN NUMBER, po_emp_tab OUT Sys_Refcursor) IS
BEGIN

    Open List_ FOR SELECT * FROM emp WHERE empno = pi_empno;

END;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表