一个简单的PL/SQL小程序

昨天一个学妹问我一个关于ORACLE这门课Assignment的问题,关于PL/SQL的,正好我在复习SQL方面的东西,所以就顺便的帮她看了一下,写了一小段代码。

题目如下:

Write a stored procedure named MAXCUST that accepts (input parameter) the registration number of a car and returns (output parameter) the customer NAME of the customer who has rented the car the greatest number of times. If more than one customer is tied for the greatest number of rentals, return the customer who rented the car most recently.

Now, write an anonymous block that calls the stored procedure and displays the customer number, customer name and customer address.

代码如下:

SET SERVEROUTPUT ON;    --打开Oracle的输出服务

 

CREATE OR REPLACE PROCEDURE MAXCUST (REGISTRATION_NUMBER IN VARCHAR2, I_CUST_NAME OUT VARCHAR2)

IS

    CURSOR CUR_BOOKING(REG I_BOOKING.REGISTRATION%TYPE) IS --定义一个游标,将汽车Registration传入,选择出来用户和他们的租赁次数

        SELECT CUST_NO, COUNT(*) "TIME"

            FROM I_BOOKING

                WHERE I_BOOKING.REGISTRATION = REG

                    GROUP BY CUST_NO;

    REC_BOOKING CUR_BOOKING%ROWTYPE;

 

    V_CUST_NO I_BOOKING.CUST_NO%TYPE;

    V_MAX_TIME NUMBER(3);

    V_MAX_DATE DATE;

    TEMP_DATE DATE;

 

BEGIN

    V_MAX_TIME := -1;

    V_CUST_NO := 0;

    OPEN CUR_BOOKING(REGISTRATION_NUMBER); -- 打开游标

    LOOP

        FETCH CUR_BOOKING INTO REC_BOOKING;

            EXIT WHEN CUR_BOOKING%NOTFOUND;

        IF (V_MAX_TIME < REC_BOOKING.TIME) THEN

            V_MAX_TIME := REC_BOOKING.TIME;

            V_CUST_NO := REC_BOOKING.CUST_NO;

            SELECT MAX(DATE_RENT_START) INTO TEMP_DATE

                FROM I_BOOKING

                    WHERE CUST_NO = REC_BOOKING.CUST_NO AND REGISTRATION = REGISTRATION_NUMBER;

        ELSIF (V_MAX_TIME = REC_BOOKING.TIME) THEN

            SELECT MAX(DATE_RENT_START) INTO TEMP_DATE

                FROM I_BOOKING

                    WHERE CUST_NO = REC_BOOKING.CUST_NO;

            IF (V_MAX_DATE < TEMP_DATE) THEN

                V_MAX_DATE := TEMP_DATE;

                V_CUST_NO := REC_BOOKING.CUST_NO;                    

            END IF;

        END IF;

    END LOOP;    /*NOW GET THE MAX TIMES*/

    

 

    SELECT CUST_NAME INTO I_CUST_NAME

        FROM I_CUSTOMER

            WHERE CUST_NO = V_CUST_NO;

            

    CLOSE CUR_BOOKING;                -- 关闭游标

    

    EXCEPTION

    WHEN NO_DATA_FOUND THEN        -- 抛出异常

        DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');

END;

    --THE ANONYMOUS BLOCK ------------------------------------------------------------------

 

DECLARE

    V_REG_NO I_BOOKING.REGISTRATION%TYPE;

    V_CUST_NAME I_CUSTOMER.CUST_NAME%TYPE;

    V_CUST_NO I_CUSTOMER.CUST_NO%TYPE;

    V_ADDRESS I_CUSTOMER.ADDRESS%TYPE;

BEGIN

    V_REG_NO := '&reg';

    MAXCUST(V_REG_NO,V_CUST_NAME);

    SELECT CUST_NO,ADDRESS INTO V_CUST_NO, V_ADDRESS

        FROM I_CUSTOMER

            WHERE CUST_NAME = V_CUST_NAME;

    DBMS_OUTPUT.PUT_LINE(CHR(10)||'Customer who has rented the car the greatest number of times');

    DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------' );

    DBMS_OUTPUT.PUT_LINE('Customer Name: ' || V_CUST_NAME ));

    DBMS_OUTPUT.PUT_LINE('Customer Number: ' || V_CUST_NO );

    DBMS_OUTPUT.PUT_LINE('Customer Address: ' || V_ADDRESS );

END;

表结构:

I_BOOKING

Name

Null?

Type

BOOKING_NO

NOT NULL

NUMBER(5)

CUST_NO

  

NUMBER(5)

DATE_RESERVED

  

DATE

RESERVED_BY

  

VARCHAR2(12)

DATE_RENT_START

  

DATE

RENTAL_PERIOD

  

NUMBER(3)

REGISTRATION

  

VARCHAR2(7)

MODEL_NAME

  

VARCHAR2(8)

MILES_OUT

  

NUMBER(6)

MILES_IN

  

NUMBER(6)

AMOUNT_DUE

  

NUMBER(6,2)

PAID

  

CHAR(1)

 

I_CUSTOMER

Name

Null?

Type

CUST_NO

NOT NULL

NUMBER(5)

CUST_NAME

NOT NULL

VARCHAR2(20)

ADDRESS

  

VARCHAR2(20)

TOWN

  

VARCHAR2(20)

COUNTY

  

VARCHAR2(20)

POST_CODE

  

VARCHAR2(10)

CONTACT

  

VARCHAR2(20)

PAY_METHOD

  

CHAR(1)

转载于:https://www.cnblogs.com/imjustice/archive/2010/12/06/2198098.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
program PL0 (input,output); (*PL/0 compiler with code generation*) (*Program 5.6 in Algorithms + Data Structures = Programs*) (*Almost identical with the version in Compilerbau*) (*Author: Niklaus Wirth*) label 99; (*定义标号*) const (*定义常量*) norw = 11; (*保留字最大长度*) txmax = 100; (*符号表最大记录数*) nmax = 14; (*数值型数据所含字符的最大长度*) al = 10; (*标识符最大长度*) amax = 2047; (*最大地址*) levmax = 3; (*分程序最大递归深度*) cxmax = 200; (*目标代码数组大小*) type (*定义类型*) symbol = (nul,ident,number,plus,minus,times,slash,oddsym, eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon, period,becomes,beginsym,endsym,ifsym,thensym, whilesym,dosym,callsym,constsym,varsym,procsym); (*单词符号机内表示*) alfa = packed array[1..al] of char; (*标识符类型*) object = (constant,variable,procedure); (*类型标识符*) symset = set of symbol; (*式后字集合类型*) fct = (lit,opr,lod,sto,cal,int,jmp,jpc); (*目标代码中的操作码类型*) instruction = packed record f: fct; (*操作码*) l: 0..levmax; (*层差*) a: 0..amax; (*相对地址*) end; (* lit 0,a: 取常量a opr 0,a: 执行a 运算 lod l,a: 取变量(相对地址为a ,层差为l) sto l,a: 存变量 (相对地址为a ,层差为l) cal l,a: 调用过程(入口地址为a ,层差为l) int 0,a: 运行栈S 的指针值增加 a jmp 0,a: 转移到指令地址a 处 jpc 0,a: 条件转移到指令地址a 处*) var ch: char; (*当前字符*) sym: symbol; (*当前单词符号*) id: alfa; (*当前标识符*) num: integer;(*当前数*) cc: integer; (*行字符计数*) ll: integer; (*行长*) kk,err: integer; cx: integer; (*目标代码存放数组下标*) line: array[1..81] of char; (*行缓冲区*) a: alfa; code: array[0..cxmax] of instruction; (*目标代码区*) word: array[1..norw] of alfa; (*保留字表*) wsym: array[1..norw] of symbol; (*保留字机内表示表*) ssym: array[char] of symbol; (*运算符、界限符机内表示表*) mnemonic: array[fct] of packed array[1..5] of char; declbegsys,statbegsys,facbegsys: symset; table: array[0..txmax] of record name: alfa; case kind: object of constant: (val: integer); variable,procedure: (level,adr: integer) end; (*符号表*) procedure error(n: integer); (*报错程序*) begin writeln('****',' ':cc-1,'^',n:2); err:= err+1 end; (*error*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值