zoukankan      html  css  js  c++  java
  • orcale存储过程学习之路(一)

     -----------------------------------------  建表  ------------------------------------------

    create table test_user
    (
    id VARCHAR2(12),
    name VARCHAR2(32),
    age number(2)
    )
    select t.id,t.name,t.age from test_user t


    insert into test_user (ID, NAME,age)
    values ('1', '张三',12);

    insert into test_user (ID, NAME,age)
    values ('2', '李四',12);

    insert into test_user (ID, NAME,age)
    values ('3', '王五',12);


    insert into test_user (ID, NAME,age)
    values ('4', '赵六',21);

    insert into test_user (ID, NAME,age)
    values ('5', '田七',21);

     -----------------------------------------  存储过程  ------------------------------------------

    1.在packages文件夹下新建一个“包”,当新建时会同时出现两个供编辑的面板:一个为“声明”的,一个为“body”部分的。

    2.编写两个空方法:

    -----------------------------------------  声明部分  ------------------------------------------

    create or replace package Pro_Test_User is
    PROCEDURE Ins_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
    PROCEDURE Upd_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
    PROCEDURE Del_Test_User(I_ID IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
    PROCEDURE Que_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2,O_RET_LIST OUT SYS_REFCURSOR);
    PROCEDURE Que_Page_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,I_PAGE_SIZE IN NUMBER,I_PAGE_NUM IN NUMBER,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2,O_RET_TOTNUM OUT NUMBER,O_RET_LIST OUT SYS_REFCURSOR);
    end Pro_Test_User;

    -----------------------------------------  BODY部分  ------------------------------------------

    create or replace package body Pro_Test_User is
    PROCEDURE Ins_Test_User(I_ID IN VARCHAR2,
    I_NAME IN VARCHAR2,
    I_AGE IN VARCHAR2,
    O_RET_CODE OUT NUMBER,
    O_RET_MSG OUT VARCHAR2)IS
    BEGIN
    O_RET_CODE:=0;
    O_RET_MSG:='初始化默认成功';
    IF I_ID IS NOT NULL AND I_NAME IS NOT NULL AND I_AGE IS NOT NULL THEN
    INSERT INTO Test_User(ID,NAME,AGE) VALUES (I_ID,I_NAME,I_AGE);
    COMMIT;
    O_RET_CODE:=0;
    O_RET_MSG:='操作成功';
    ELSE
    O_RET_CODE:=1;
    O_RET_MSG:='没有ID|姓名|年龄';
    END IF;
    EXCEPTION
    WHEN OTHERS THEN
    O_RET_CODE:=-1;
    O_RET_MSG:='sql执行过程出错啦!';
    END Ins_Test_User;

    PROCEDURE Upd_Test_User(I_ID IN VARCHAR2,
    I_NAME IN VARCHAR2,
    I_AGE IN VARCHAR2,
    O_RET_CODE OUT NUMBER,
    O_RET_MSG OUT VARCHAR2)IS
    BEGIN
    O_RET_CODE:=0;
    O_RET_MSG:='初始化默认成功';
    IF I_ID IS NOT NULL THEN
    UPDATE Test_User SET NAME=I_NAME,
    AGE =I_AGE
    WHERE ID= I_ID;
    COMMIT;
    O_RET_CODE:=0;
    O_RET_MSG:='操作成功';
    ELSE
    O_RET_CODE:=1;
    O_RET_MSG:='没有ID';
    END IF;
    EXCEPTION
    WHEN OTHERS THEN
    O_RET_CODE:=-1;
    O_RET_MSG:='sql执行过程出错啦!';
    END Upd_Test_User;

    PROCEDURE Del_Test_User(I_ID IN VARCHAR2,
    O_RET_CODE OUT NUMBER,
    O_RET_MSG OUT VARCHAR2)IS
    BEGIN
    NULL;
    END Del_Test_User;

    PROCEDURE Que_Test_User(I_ID IN VARCHAR2,
    I_NAME IN VARCHAR2,
    I_AGE IN VARCHAR2,
    O_RET_CODE OUT NUMBER,
    O_RET_MSG OUT VARCHAR2,
    O_RET_LIST OUT SYS_REFCURSOR)IS
    T_SQL VARCHAR2(200):='';
    U Test_User%rowtype;
    BEGIN
    NULL;
    IF I_NAME IS NOT NULL THEN
    T_SQL := T_SQL || 'AND T.NAME = ''' || I_NAME || '''';
    END IF;
    IF I_AGE IS NOT NULL THEN
    T_SQL := I_AGE || 'AND T.AGE = ''' || I_AGE || '''';
    END IF;
    T_SQL := 'SELECT T.ID,T.NAME,T.AGE FROM Test_User T WHERE 1=1'|| T_SQL ;
    OPEN O_RET_LIST FOR T_SQL;
    loop
    fetch O_RET_LIST into U.id, U.name,U.age;
    exit when O_RET_LIST%notfound;
    dbms_output.put_line(U.id||'-'||U.name||'-'||U.age);
    end loop;
    END Que_Test_User;

    PROCEDURE Que_Page_Test_User(I_ID IN VARCHAR2,
    I_NAME IN VARCHAR2,
    I_AGE IN VARCHAR2,
    I_PAGE_SIZE IN NUMBER,
    I_PAGE_NUM IN NUMBER,
    O_RET_CODE OUT NUMBER,
    O_RET_MSG OUT VARCHAR2,
    O_RET_TOTNUM OUT NUMBER,
    O_RET_LIST OUT SYS_REFCURSOR)IS
    O_Q_SQL VARCHAR2(200):='';
    O_T_SQL VARCHAR2(200):='';
    I_PRA VARCHAR2(200):='';
    BEGIN_ROW NUMBER :=0;
    END_ROW NUMBER :=I_PAGE_SIZE;
    BEGIN
    O_RET_CODE:=0;
    O_RET_MSG:='初始化默认成功';
    IF I_PAGE_SIZE IS NOT NULL AND I_PAGE_NUM IS NOT NULL THEN
    BEGIN_ROW := (I_PAGE_NUM-1)*I_PAGE_SIZE+1;
    END_ROW := I_PAGE_NUM *I_PAGE_SIZE ;
    IF I_NAME IS NOT NULL THEN
    I_PRA := I_PRA || 'AND T.NAME LIKE ''%' || I_NAME || '%''';
    END IF;
    IF I_AGE IS NOT NULL THEN
    I_PRA := I_PRA || 'AND T.AGE = ''' || I_AGE || '''';
    END IF;
    O_Q_SQL := 'SELECT T.ID,T.NAME,T.AGE FROM (SELECT ROWNUM RN ,TE.* FROM Test_User TE WHERE ROWNUM <='|| END_ROW ||') T WHERE T.RN >= '|| BEGIN_ROW || I_PRA ;
    OPEN O_RET_LIST FOR O_Q_SQL;
    O_T_SQL := 'SELECT COUNT(ID) AS TOTNUM FROM Test_User WHERE 1=1'|| I_PRA ;
    DBMS_OUTPUT.put_line(O_T_SQL);
    O_RET_CODE:=0;
    O_RET_MSG:='操作成功';
    ELSE
    O_RET_CODE:=1;
    O_RET_MSG:='没有页码详情';
    END IF;
    DBMS_OUTPUT.put_line(O_T_SQL);
    DBMS_OUTPUT.put_line(O_RET_MSG);
    EXCEPTION
    WHEN OTHERS THEN
    O_RET_CODE:=-1;
    O_RET_MSG:='sql执行过程出错啦!';
    END Que_Page_Test_User;

    end Pro_Test_User;

    3.存储语句写完后在执行一个左上角的“设置”按钮。

    4.查看packages和package bodies下是否有生成的存储过程

    调用(一):

    declare
    I_ID VARCHAR2(10);
    I_NAME VARCHAR2(10);
    I_AGE VARCHAR2(10);
    O_RET_CODE NUMBER;
    O_RET_MSG VARCHAR2(10);
    p_ref1 SYS_REFCURSOR;
    result_ SYS_REFCURSOR;
    begin
    Pro_Test_User.Que_Test_User(I_ID,I_NAME,I_AGE,O_RET_CODE,O_RET_MSG,p_ref1);
    DBMS_OUTPUT.put_line(O_RET_MSG);
    end;

     调用(二):

    declare
    I_ID VARCHAR2(10);
    I_NAME VARCHAR2(10);
    I_AGE VARCHAR2(10);
    O_RET_CODE NUMBER;
    O_RET_MSG VARCHAR2(10);
    p_ref1 SYS_REFCURSOR;
    result_ SYS_REFCURSOR;
    begin
    Pro_Test_User.Que_Test_User(I_ID,I_NAME,I_AGE,O_RET_CODE,O_RET_MSG,O_RET_LIST=>p_ref1);
    loop
    fetch p_ref1 into I_ID,I_NAME,I_AGE;
    dbms_output.put_line(I_NAME||'------------'||I_AGE);
    exit when p_ref1%notfound;
    end loop;
    end;

    调用(三):

    declare
    v_cursor sys_refcursor;
    ret_code NUMBER;
    ret_msg VARCHAR2(10);
    u Test_User%rowtype;
    begin
    Pro_Test_User.Que_Test_User(2,'张三','',ret_code,ret_msg,v_cursor);
    loop
    fetch v_cursor into u.id, u.name,u.age;
    exit when v_cursor%notfound;
    dbms_output.put_line(u.id||'-'||u.name||'-'||u.age);
    end loop;
    end;

  • 相关阅读:
    【JDBC】JDBC实战
    【JDBC】JDBC操作实战
    【Oracle】事务、表复制
    Hibernate 再接触 继承映射
    Hibernate 再接触 集合映射
    Hibernate 再接触 CRUD
    Hibernate 再接触 多对多单向双向关联
    Hibernnate 一对多多对一双向关联
    Hibernate 再接触 一对多单向关联
    Hibernate 再接触 多对一与一对多
  • 原文地址:https://www.cnblogs.com/kongxc/p/9223667.html
Copyright © 2011-2022 走看看