免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1775 | 回复: 4
打印 上一主题 下一主题

新手求助,关于ORACLE的存储过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-21 12:24 |只看该作者 |倒序浏览
现有两个表1、人员信息表 2、金额发放条件表

人员信息表,人员信息大约1000人
姓名      年龄   
张三       50
李四       60
王二       70

金额发放条件表
STARTAGE    ENDAGE   PAY
45           55     500
55           65     800
65           75     900
75                 1000

请教如何编写一个存储过程来实现自动生成如下的表
张三     500
李四     800
王二     900

[ 本帖最后由 大脚王 于 2007-1-21 12:28 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-21 14:12 |只看该作者

sadfasdfasdfa

CREATE TABLE EMPLOYEE
(
  NAME  VARCHAR2(10 BYTE),
  AGE   NUMBER
);

CREATE TABLE PAY
(
STARTAGE NUMBER,
ENDAGE NUMBER,
PAY NUMBER
);

INSERT INTO EMPLOYEE
(NAME,AGE) VALUES ('张三', 50);

INSERT INTO EMPLOYEE
(NAME,AGE) VALUES ('李四', 60);

INSERT INTO EMPLOYEE
(NAME,AGE) VALUES ('王五', 70);

INSERT INTO PAY (STARTAGE,ENDAGE,PAY) VALUES
(45,55,500);

INSERT INTO PAY (STARTAGE,ENDAGE,PAY) VALUES
(65,75,900);

INSERT INTO PAY (STARTAGE,ENDAGE,PAY) VALUES
(55,65,800);
          
CREATE OR REPLACE PROCEDURE P_PAY IS
tmpVar NUMBER;
CURSOR c_employee is
     SELECT  B.NAME,A.PAY FROM EMPLOYEE B, PAY A
           WHERE B.AGE <  A.ENDAGE
           AND B.AGE >  A.STARTAGE;
L_NAME VARCHAR2(10);
L_PAY NUMBER;
/******************************************************************************
   NAME:       test
   PURPOSE:   

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2007-1-21   lhb       1. Created this procedure.

   NOTES:

******************************************************************************/
BEGIN
   tmpVar := 0;
   OPEN c_employee;
   LOOP
                   Fetch c_employee into L_NAME,L_PAY;
             DBMS_OUTPUT.PUT_LINE('NAME:'||L_NAME);
             DBMS_OUTPUT.PUT_LINE('PAY:'||L_PAY);
           EXIT WHEN c_employee%NOTFOUND;
    END LOOP;
         CLOSE c_students;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END;

[ 本帖最后由 hb_li_520 于 2007-1-21 23:20 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-01-21 21:31 |只看该作者
select a.name, b.pay from tab1 a, tab2 b where a.age >= b.startage and a.age <b.startage
金额表中的 行 75                 1000可能需要处理一下, 使得这行的end age大于tab1中任何人的年龄.
要不然需要对查询的条件进行处理, 使其可以处理空值

论坛徽章:
0
4 [报告]
发表于 2007-01-22 08:23 |只看该作者
以为自己能够根据例子进行更改,但是还是很郁闷!!

create or replace procedure GET_PAY(CYEAR STRING, ANNALS STRING) is
cursor C_CURSOR is
     SELECT A.PNAME, A.BIRTHDAY,A.CARD, TO_CHAR(A.BIRTHDAY,'YYYY') AS BYEAR,
            TO_CHAR(A.BIRTHDAY,'MM') AS BMONTH , TO_CHAR(A.BIRTHDAY, 'DD') AS BDAY,
            (TO_CHAR(SYSDATE,'YYYY'))- TO_CHAR(A.BIRTHDAY,'YYYY')  AS AGE, B.PAY*6
     FROM ADMIN.ASSOCIATOR A, BASIC_PENSION B
     WHERE TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(A.BIRTHDAY,'YYYY') >= B.STARTAGE
          AND TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(A.BIRTHDAY,'YYYY') < B.ENDAGE
           AND A.BOON = 1
   
               
Lv_PNAME        ASSOCIATOR.PNAME%TYPE;
Lv_CARD         ASSOCIATOR.CARD%TYPE;
Lv_BIRTHDAY     ASSOCIATOR.BIRTHDAY%TYPE;
Lv_BYear        NUMBER;
Lv_BMonth       NUMBER;
Lv_BDay         NUMBER;
Lv_Age          NUMBER;  
Lv_Pay          NUMBER;                     

BEGIN         
    OPEN C_CURSOR;
    LOOP
        FETCH C_CURSOR into Lv_PNAME,Lv_BIRTHDAY,Lv_CARD,Lv_BYear,Lv_BMonth,Lv_BDay,Lv_Age,Lv_Pay;

         EXIT WHEN C_CURSOR%NOTFOUND;               
    END LOOP;
         CLOSE C_CURSOR;
    EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
   
    close C_CURSOR;
end GET_PENSION;

提示我SQL命令未能正确结束??郁闷!!

因为我还需要按照出生日期来判断是否需要进入下一档的付费标准
例如,55岁3月份出生,则1月、2月的标准按照45--55标准,3到6月按照55--65标准计算
所以,SELECT语句如上。

[ 本帖最后由 大脚王 于 2007-1-22 14:15 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-01-22 14:51 |只看该作者
下了班再给你看看.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP